需要关于 pthread 同步的建议/建议(结合使用条件变量和屏障)

Posted

技术标签:

【中文标题】需要关于 pthread 同步的建议/建议(结合使用条件变量和屏障)【英文标题】:Need advice/suggestion on pthread synchronization (combine the use of condition variable and barrier) 【发布时间】:2012-12-23 07:47:12 【问题描述】:

我有以下场景:

我把一个任务拆分成几个stage,每个stage有几个线程做实际的工作,后面stage的线程需要等待当前stage的所有线程完成。

例如:

线程 1、2、3 正在执行第一步中的工作

线程 4、5、6 正在执行第二步中的工作

线程 7、8、9 正在执行第三步 ...

每一步的线程都是独立的,但需要等待上一步的线程完成。

这是我想要实现的方法:

    在当前步骤的每个线程中,等待表示当前步骤是否可以启动的条件 一旦可以开始当前步骤,所有线程都开始工作,并在屏障上等待此步骤中的所有线程完成 此步骤中的所有线程完成后,在下一步线程正在等待的条件变量上广播

这有意义吗?这里有什么明显的错误吗?

我被多线程程序的高级语言结构宠坏了,使用 pthread API 对我来说很痛苦。在这里,我需要一些关于此用例中最佳实践的建议?非常感谢

【问题讨论】:

您的策略看起来足够好。在您的场景中,并行化方法是(1)“流水线”任务和(2)每个“分叉连接”阶段,它们利用 (1) 的条件变量和 (2) 的障碍。 感谢您的评论,@yohjp。我已经通过应用上述方法实现了一个可行的解决方案:) 【参考方案1】:

对于对此问题感兴趣的人。我已经实施了一个可行的解决方案。我认为这应该是典型的并行/并发问题,正如 yohjp 评论的那样:

1 "Pipelined" tasks
2 "Join" on each of the stage

我使用了 [num_stage] 个 pthread 屏障数组和一个 [num_stage+1] (pthread_cond_t, pthread_mutex_t) 对数组。因为在主线程中,它会使用另外一个条件变量来启动。

如果有人想要示例代码,请通过电子邮件与我联系,因为这是一项作业的一部分,我无法将代码发布到 github。

这是我第一个使用原始pthread api的非试用多线程程序,相当愉快的体验:)

【讨论】:

以上是关于需要关于 pthread 同步的建议/建议(结合使用条件变量和屏障)的主要内容,如果未能解决你的问题,请参考以下文章

关于创建相互依赖的异步调用的建议

关于PHP新手学习的一些指导与建议,新手快到我碗里来!

为啥 Google 建议将 CloudKMS 应用层加密与 Cloud Storage 结合使用?

关于HDFS的一些知识点(建议收藏)

使多个上下文中的 NSManagedObjects 保持同步

关于Java代码优化的44条建议!