C# 多线程填充数组
在C#Net 2.0上 代码的工作速度比单线程版本稍慢。xDiff=2100,yDiff=2000;单线程几乎14秒,多线程大约16秒(此代码)。一定是出了什么事。 我需要填充结果数组。只有一次在数组的节点上写入数据,并没有读取,所以它应该适合多线程C# 多线程填充数组,c#,arrays,multithreading,.net-2.0,C#,Arrays,Multithreading,.net 2.0,在C#Net 2.0上 代码的工作速度比单线程版本稍慢。xDiff=2100,yDiff=2000;单线程几乎14秒,多线程大约16秒(此代码)。一定是出了什么事。 我需要填充结果数组。只有一次在数组的节点上写入数据,并没有读取,所以它应该适合多线程 double[,] result = new double[xDiff, yDiff]; int threadCount = Environment.ProcessorCount; ManualResetEvent finished = new M
double[,] result = new double[xDiff, yDiff];
int threadCount = Environment.ProcessorCount;
ManualResetEvent finished = new ManualResetEvent(false);
int perthread = xDiff / threadCount;
int left = xDiff % threadCount;
int toProcess = threadCount;
int s = 0;
int e = left;
for (int ii = 0; ii < threadCount; ii++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
{
for (int x = s; x < e; x++)
for (int y = 0; y < yDiff; y++)
{
result[x, y] = DoWork((xStart + x), (yStart + y), p)
}
if (System.Threading.Interlocked.Decrement(ref toProcess) == 0) finished.Set();
}), null);
s = e;
e += perthread;
}
finished.WaitOne();
return result;
double[,]结果=新的双精度[xDiff,yDiff];
int threadCount=Environment.ProcessorCount;
ManualResetEvent finished=新的ManualResetEvent(错误);
int perthread=xDiff/threadCount;
int left=xDiff%threadCount;
int toProcess=线程数;
int s=0;
int e=左;
用于(int ii=0;ii
xStart,yStart是double,p是一个大类。DoWork函数只调用p的一些函数,但不在类上写入/更改任何数据
简单结果[x,y]=DoWork((xStart+x),(yStart+y),p);
我需要尽快填充数组。我该怎么做?我认为这里的问题是变量
s
和e
是在线程外部修改的闭包,因此线程得到了错误的值,并且使用了错误的范围
若要查看是否是这种情况,请尝试添加控制台.WriteLine()
或跟踪.WriteLine()
,以打印线程内s
和e
的值(在调用QueueUserWorkItem()
之后),以查看是否发生了这种情况
要解决此问题,请将修改后的闭包复制到临时变量中,并在线程中使用这些变量,如下所示:
for (int ii = 0; ii < threadCount; ii++)
{
int ts = s; // Copy them outside the loop.
int te = e;
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
{
for (int x = ts; x < te; x++) // Use the copy here.
for(int ii=0;ii
另请参见DoWork是否正在执行某些阻塞操作?如果是这样,您最好在每次调用DoWork时将一个新的工作项排队。请注意,QueueUserWorkItem实际上并没有使用并行类中的一个现成循环创建新的threadsConsider。您的情况看起来并不特别。@usr一开始我忽略了这一点,但OP使用.NET 2.0。谢谢当我检查s和e时,所有线程都试图填充所有数组。