【发布时间】:2016-07-11 13:59:44
【问题描述】:
在下面的例子中,似乎for循环的索引i被每个线程独立修改,导致DoWork_Threaded()中i的奇怪值(倍数,甚至大于System.Environment.ProcessorCount-1的值)
如何在 C# 中正确完成多线程循环?
// Prepare all threads
Thread[] threads = new Thread[System.Environment.ProcessorCount];
// Start all threads
for (int i = 0; i < System.Environment.ProcessorCount; i++)
{
threads[i] = new Thread(() => DoWork_Threaded(i));
threads[i].Start();
}
// Wait for completion of all threads
for (int i = 0; i < System.Environment.ProcessorCount; i++)
{
threads[i].Join();
}
【问题讨论】:
-
感谢您的回答,但这对索引 i 有何帮助? PS:它也不起作用。
-
尝试复制循环内的值
int a = i;然后DoWork_Threaded(a); -
要了解为什么您的代码表现得像这样,您可以阅读blogs.msdn.microsoft.com/ericlippert/2009/11/12/…。它也与线程完全无关。任何对循环变量的闭包都可能导致您描述的行为。
-
@Dirk:虽然问题的原因与线程无关,但从多个线程访问闭包会使问题变得更糟,因为变量的观察值变得不确定。
-
你为什么不使用ThreadPool?看来你想实现类似的东西。对于索引部分,您可能需要阅读 this 以了解它为什么不起作用。
标签: c# multithreading thread-safety