首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Parallel.For中,可以同步每个线程吗?

在Parallel.For中,可以同步每个线程吗?
EN

Stack Overflow用户
提问于 2014-05-21 20:17:21
回答 2查看 2.3K关注 0票数 3

在Parallel.For中,可以使用'WaitAll‘同步每个线程吗?

代码语言:javascript
运行
复制
  Parallel.For(0, maxIter, i =>
  {
            // Do stuffs

           // Synchronisation : wait for all threads => ???

           // Do another stuffs
  });
EN

回答 2

Stack Overflow用户

发布于 2014-05-21 20:31:29

Parallel.For在后台将循环的迭代批处理到一个或多个可以并行执行的Tasks中。除非您拥有分区的所有权,否则任务(和线程)的数量是(也应该是!)被抽离了。只有在所有任务都完成后(即不需要WaitAll),控件才会退出Parallel.For循环。

当然,这个想法是每个循环迭代都是独立的,不需要同步。

如果在紧密循环中需要同步,那么您没有正确地隔离任务,或者这意味着Amdahl's Law正在生效,问题不能通过并行化来加速。

但是,对于聚合类型模式,您可能需要在每个任务完成后进行同步-使用overloadlocalInit / localFinally来执行此操作,例如:

代码语言:javascript
运行
复制
// 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);
     }
  });

在上面的示例中,您也可以只将allTheStrings声明为

代码语言:javascript
运行
复制
var allTheStrings = new ConcurrentBag<string>();

在这种情况下,我们就不需要在localFinally中使用lock

票数 5
EN

Stack Overflow用户

发布于 2014-05-21 21:44:41

你不应该(因为其他用户所说的原因),但是如果你愿意,你可以使用Barrier。这可以用来导致所有线程在X个参与者遇到障碍之前的某个时间点等待(阻塞),从而导致障碍继续进行和线程解除阻塞。正如其他人所说,这种方法的缺点是死锁

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23782923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档