TPL Parallel.for如何处理数据锁定

时间:2013-09-26 20:55:52

标签: c# parallel-processing task-parallel-library parallel.foreach

我正在尝试理解TPL的更低级操作,并且想知道并行处理数据锁定的方式,例如:在2D阵列上执行计算。我一直在MSDN圈子里走动,但未能找到详细的解释。有什么建议?

3 个答案:

答案 0 :(得分:1)

如果您在for循环体中访问/修改共享可变状态,则同步该访问权取决于您。

答案 1 :(得分:0)

它不需要任何锁定,因为从来没有任何情况下多个线程访问内存中的相同位置。有一个单独的线程正在为工人安排工作,削减要完成的工作部分并将其分发出去。因为只有一个线程执行此操作,所以不需要与其他任何人同步。没有工人(应该)处理共享数据。

答案 2 :(得分:0)

我会发布严重的过度简化来在代码中绘制图片;将此发布到控制台应用程序中,它将吐出数据以及哪个线程正在处理它。您可以对此进行更新以使用您自己的数据,使其更具相关性。

        var list = new List<int>(64);

        for (var i = 1; i <= 64; i++)
        {
            list.Add(i);
        }

        var result = Parallel.ForEach(list, entry =>
        {
            var line = string.Format("Thread ID {0} is listing entry {1}", Thread.CurrentThread.ManagedThreadId, entry);
            Console.WriteLine(line);
        });

        while (!result.IsCompleted)
        {
            Thread.Sleep(50);
        }

        Console.ReadKey();