创建一个示例,显示修改公共变量的线程

时间:2014-07-28 21:59:10

标签: c# parallel-processing parallel.foreach

我想创建一个在使用并行循环时显示失败的示例。 我试图编写一个示例,在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'通过线程。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的threadNum已在闭包中声明,因此each thread will have its own copy

你可以把它移到封锁之外。

证明并发问题的一种更好的方法可能是让多个线程递增相同的变量(在所有线程都可访问的范围中定义)。 ++运算符不是原子的,因此最终结果不可能是NumberOfThreads * NumberOfIterationsPerThread(假设你从零开始)。