我有两种方法的程序。第一种方法需要两个数组作为参数,并执行,其中来自一个阵列被有条件地写入到其它,像这样值的运算:关于多线程,锁和多核处理器的多部分问题(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