我有兩種方法的程序。第一種方法需要兩個數組作爲參數,並執行,其中來自一個陣列被有條件地寫入到其它,像這樣值的運算:關於多線程,鎖和多核處理器的多部分問題(multi^3)
void Blend(int[] dest, int[] src, int offset)
{
for (int i = 0; i < src.Length; i++)
{
int rdr = dest[i + offset];
dest[i + offset] = src[i] > rdr? src[i] : rdr;
}
}
第二種方法通過他們創建int
陣列和迭代的兩套獨立的這樣一組的每個陣列是Blend
版與另一組的每個陣列,像這樣:
void CrossBlend()
{
int[][] set1 = new int[150][75000]; // we'll pretend this actually compiles
int[][] set2 = new int[25][10000]; // we'll pretend this actually compiles
for (int i1 = 0; i1 < set1.Length; i1++)
{
for (int i2 = 0; i2 < set2.Length; i2++)
{
Blend(set1[i1], set2[i2], 0); // or any offset, doesn't matter
}
}
}
第一個問題:由於此之路探尋是並行的明顯的候選人,是它的本質是線程安全的?這似乎是否定的,因爲我可以設想一個場景(不太可能,我認爲)一個線程的更改由於不同的線程〜同時操作而丟失。
如果沒有,就這樣:
void Blend(int[] dest, int[] src, int offset)
{
lock (dest)
{
for (int i = 0; i < src.Length; i++)
{
int rdr = dest[i + offset];
dest[i + offset] = src[i] > rdr? src[i] : rdr;
}
}
}
是一個有效的解決?
第二個問題:如果是這樣,使用這種鎖的可能性能成本是多少?我認爲,如果某個線程嘗試鎖定當前被另一個線程鎖定的目標數組,則第一個線程會阻塞,直到鎖被釋放,而不是繼續處理某些內容。
另外,它需要多少時間才能獲得鎖定?納秒級別還是比這還差?這會成爲像這樣的主要問題嗎?
第三個問題:我將如何最好的辦法這個問題,將充分利用多核處理器的(這是基於潛在的錯誤的假設,一個多線程的解決辦法不是速度多線程方式在單個核心處理器上執行此操作)?我猜想我希望每個核心都有一個線程運行,但我不知道這是否正確。
您將在<100ns內獲得無爭議的鎖定。 – Rusty 2010-06-05 22:18:58
看看PLINQ。 [瞭解PLINQ中的加速](http://msdn.microsoft.com/en-us/library/dd997399%28v=VS.100%29.aspx) – Rusty 2010-06-05 22:26:43