C# 例如,可以同步每个线程吗?

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中,是否可以使用“WaitAll”同步每个线程

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