Pat*_*ier 3 c# synchronization parallel.for
在Parallel.For中,是否可以使用'WaitAll'同步每个线程?
Parallel.For(0, maxIter, i =>
{
// Do stuffs
// Synchronisation : wait for all threads => ???
// Do another stuffs
});
Run Code Online (Sandbox Code Playgroud)
Parallel.For在后台,将循环的迭代批处理为一个或多个Tasks,可以并行执行.除非您拥有分区的所有权,否则任务(和线程)的数量(并且应该!)被抽象掉.Parallel.For一旦所有任务完成(即不需要WaitAll),控制将仅退出循环.
当然,这个想法是每个循环迭代都是独立的,不需要同步.
如果在紧密循环中需要同步,那么您没有正确地隔离任务,或者这意味着Amdahl定律生效,并且无法通过并行化加速问题.
但是,对于聚合类型模式,您可能需要在完成每个任务后进行同步 - 使用带有/ 的重载来执行此操作,例如:localInitlocalFinally
// allTheStrings is a shared resource which isn't thread safe
var allTheStrings = new List<string>();
Parallel.For( // for (
0, // var i = 0;
numberOfIterations, // i < numberOfIterations;
() => new List<string> (), // localInit - Setup each task. List<string> --> localStrings
(i, parallelLoopState, localStrings) =>
{
// The "tight" loop. If you need to synchronize here, there is no point
// using parallel at all
localStrings.Add(i.ToString());
return localStrings;
},
(localStrings) => // local Finally for each task.
{
// Synchronization needed here is needed - run once per task
lock(allTheStrings)
{
allTheStrings.AddRange(localStrings);
}
});
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,您也可以声明allTheStrings为
var allTheStrings = new ConcurrentBag<string>();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们不会要求lock在localFinally.