【问题标题】:How does a TPL Parallel.for handle data lockingTPL Parallel.for 如何处理数据锁定
【发布时间】:2013-09-27 05:17:37
【问题描述】:

我正在尝试了解 TPL 的更低级别的操作,并且想知道并行处理数据锁定的方式,例如对二维数组执行计算。我一直在 MSDN 上兜圈子,一直没能找到详细的解释。有什么建议么?

【问题讨论】:

  • IME,TPL 根本不处理这个。线程助手有各种限制。文件锁定就是其中之一。如果您愿意,“自动并发”仅限于内存问题。 Windows Workflow Foundation 也存在类似问题。有时老派多线程是要走的路(等待句柄等)。
  • TPL 不是“线程助手”,Workflow Foundation 也不适合甚至用于细粒度并发。实际上,PLINQ 和 TPL 实现了不同的并发范式(任务并发 vs 数据并发)。线程只是用于处理任务/数据的方式。 TaskScheduler 可以使用纤程、外部进程或远程机器来执行其有效负载,并且它对任务本身或 lambdas 是不可见的

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    它不需要任何锁定,因为从不存在多个线程访问内存中相同位置的情况。有一个线程正在为工人安排工作,切出要完成的工作部分并将它们分发出去。因为只有一个线程在做这件事,所以它不需要与其他任何人同步。没有工作人员(应该)处理共享数据。

    【讨论】:

    • 这真的取决于循环内的代码类型。您当然可以使用需要锁定的Parallel.For() 编写代码。
    【解决方案3】:

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

            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();
    

    【讨论】:

    • 这如何回答这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多