我想创建一个在使用并行循环时显示失败的示例。 我试图编写一个示例,在Prallel中显示。对于两个线程可能会修改一个公共(非线程局部)变量。为此,我编写了以下示例,其中一个线程将其编号分配给一个变量,然后我们添加一个延迟来查看是否有任何其他线程将覆盖此变量。在输出中,它的覆盖永远不会发生在我身上。
Parallel.For(0, result.Length, ii =>
{
int threadNum = Thread.CurrentThread.ManagedThreadId;
Thread.Sleep(10000);
if (threadNum != Thread.CurrentThread.ManagedThreadId)
Console.WriteLine("threadNum = {0}, Thread.CurrentThread.ManagedThreadId = {1}", threadNum, Thread.CurrentThread.ManagedThreadId);
});
有人可能会说我拖延了所有线程。所以我只将延迟添加到一个线程:
int num = -1;
Parallel.For(0, result.Length, ii =>
{
if( num == -1)
num = Thread.CurrentThread.ManagedThreadId;
int threadNum = Thread.CurrentThread.ManagedThreadId;
if (Thread.CurrentThread.ManagedThreadId == num)
{
Console.WriteLine("num = {0}", num);
Thread.Sleep(10);
}
if (threadNum != Thread.CurrentThread.ManagedThreadId)
Console.WriteLine("threadNum = {0}, Thread.CurrentThread.ManagedThreadId = {1}", threadNum, Thread.CurrentThread.ManagedThreadId);
});
这里只记得第一个帖子,只是延迟了。我仍然没有观察到变量' threadNum'通过线程。
有什么想法吗?
答案 0 :(得分:1)
您的threadNum
已在闭包中声明,因此each thread will have its own copy。
你可以把它移到封锁之外。
证明并发问题的一种更好的方法可能是让多个线程递增相同的变量(在所有线程都可访问的范围中定义)。 ++运算符不是原子的,因此最终结果不可能是NumberOfThreads * NumberOfIterationsPerThread(假设你从零开始)。