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

C# TPL Parallel.for如何处理数据锁定,c#,parallel-processing,task-parallel-library,parallel.foreach,C#,Parallel Processing,Task Parallel Library,Parallel.foreach,我试图理解TPL的较低级别操作,并想知道并行程序如何处理数据锁定,例如在2D数组上执行计算。我一直在MSDN上兜圈子,没有找到详细的解释。有什么建议吗 它不需要任何锁定,因为从来没有多个线程访问内存中相同位置的情况。有一个单一的线程是为工人安排工作,切割出要完成的工作的部分并分发给他们。因为只有一个线程执行此操作,所以它不需要与其他任何线程同步。没有一个工作线程(应该)处理共享数据。它不需要任何锁定,因为从来没有多个线程访问内存中相同位置的情况。有一个单一的线程是为工人安排工作,切割出要完成的工

我试图理解TPL的较低级别操作,并想知道并行程序如何处理数据锁定,例如在2D数组上执行计算。我一直在MSDN上兜圈子,没有找到详细的解释。有什么建议吗

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

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

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

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

我将发布一篇过于简单的文章,用代码来描绘这幅画面;将此信息发布到控制台应用程序中,它将吐出数据以及哪个线程正在处理这些数据。您可以使用自己的数据对其进行更新,使其更加相关

        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();
var列表=新列表(64);
对于(var i=1;i
{
var line=string.Format(“线程ID{0}列出了条目{1}”,Thread.CurrentThread.ManagedThreadId,条目);
控制台写入线(行);
});
而(!result.IsCompleted)
{
睡眠(50);
}
Console.ReadKey();

我将发布一篇过于简单的文章,用代码来描绘画面;将此信息发布到控制台应用程序中,它将吐出数据以及哪个线程正在处理这些数据。您可以使用自己的数据对其进行更新,使其更加相关

        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();
var列表=新列表(64);
对于(var i=1;i
{
var line=string.Format(“线程ID{0}列出了条目{1}”,Thread.CurrentThread.ManagedThreadId,条目);
控制台写入线(行);
});
而(!result.IsCompleted)
{
睡眠(50);
}
Console.ReadKey();

IME,TPL根本不处理这个问题。线程助手有各种限制。文件锁定就是其中之一。如果愿意,“自动并发”仅限于内存中的问题。Windows工作流基金会遇到类似的问题。有时,旧的多线程是要走的路(Waythand等)。TPL不是一个“线程帮助器”,也不是工作流基础适合或甚至用于细粒度并发。事实上,PLINQ和TPL实现了不同的并发范式(任务并发与数据并发)。线程只是用来处理任务/数据的方式。TaskScheduler可以使用光纤、外部进程或远程机器来执行其有效负载,而任务本身或lambdasIME将看不到它,TPL根本无法处理此问题。线程助手有各种限制。文件锁定就是其中之一。如果愿意,“自动并发”仅限于内存中的问题。Windows工作流基金会遇到类似的问题。有时,旧的多线程是要走的路(Waythand等)。TPL不是一个“线程帮助器”,也不是工作流基础适合或甚至用于细粒度并发。事实上,PLINQ和TPL实现了不同的并发范式(任务并发与数据并发)。线程只是用来处理任务/数据的方式。TaskScheduler可以使用光纤、外部进程或远程机器来执行其有效负载,而它对任务本身或lambdast不可见,这实际上取决于循环中的代码类型。您当然可以使用需要锁定的
Parallel.For()
编写代码。这取决于循环中的代码类型。您当然可以使用需要锁定的
Parallel.For()
编写代码。这如何回答问题?这如何回答问题?