需要关于 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 同步的建议/建议(结合使用条件变量和屏障)的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Google 建议将 CloudKMS 应用层加密与 Cloud Storage 结合使用?