C# 例如,可以同步每个线程吗?
在Parallel.For中,是否可以使用“WaitAll”同步每个线程C# 例如,可以同步每个线程吗?,c#,synchronization,parallel.for,C#,Synchronization,Parallel.for,在Parallel.For中,是否可以使用“WaitAll”同步每个线程 Parallel.For(0, maxIter, i => { // Do stuffs // Synchronisation : wait for all threads => ??? // Do another stuffs }); 并行。对于,在后台,将循环的迭代批处理为一个或多个任务,这些任务可以并行执行。除非您拥有分
Parallel.For(0, maxIter, i =>
{
// Do stuffs
// Synchronisation : wait for all threads => ???
// Do another stuffs
});
并行。对于
,在后台,将循环的迭代批处理为一个或多个任务,这些任务可以并行执行。除非您拥有分区的所有权,否则任务(和线程)的数量是(而且应该!)抽象掉的。控件仅在所有任务完成后退出Parallel.For
循环(即不需要WaitAll
)
当然,每个循环迭代都是独立的,不需要同步
如果在紧循环中需要同步,那么您没有正确地隔离任务,或者这意味着这是有效的,并且无法通过并行化来加速问题
但是,对于聚合类型模式,您可能需要在每个任务完成后进行同步-使用与localInit
/localFinally
一起执行此操作,例如:
// 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);
}
});
在这种情况下,我们不需要在
localFinally
中使用lock
,您不应该(出于其他用户所述的原因),但如果您愿意,可以使用。这可用于使所有线程在X个参与者到达某个障碍之前的某一点等待(阻塞),从而导致障碍继续,线程取消阻塞。正如其他人所说,这种方法的缺点是死锁为什么不调用Parallel。两次?不要!认真地你在线程池线程上运行,永远不要在线程池线程上执行任何等待或锁定操作(这是一种获得死锁的好方法,如果你正在编写一个库,并且有人从ASP.NET使用它,这将是一件非常有趣的事)-很可能,有更好的方法可以做到这一点。例如,为什么不调用Parallel。对于两次-第一次对于第一部分,当它结束时,所有线程都完成了。然后是第二部分,另一个For
调用。我同意你的观点,但有可能吗?localFinally并没有真正帮助我,因为我想以相同的并行方式开始一些计算。因为在同步之后为了避免同步,你需要确保每个任务
都有自己的资源实例身体需要(紧环)。如果在主体中进行同步,那么瓶颈可能在其他地方,并行化不会提高性能。我添加了评论?
var allTheStrings = new ConcurrentBag<string>();