在多线程应用程序中使用屏障的真实示例是啥?

Posted

技术标签:

【中文标题】在多线程应用程序中使用屏障的真实示例是啥?【英文标题】:What would be a realworld example of use of a barrier in a multithreaded application?在多线程应用程序中使用屏障的真实示例是什么? 【发布时间】:2010-12-22 16:15:51 【问题描述】:

JDK 的并发包、Boost 的线程库、Perl 的 Thread 库(虽然不是在 Python 中)都实现了屏障,我没有遇到过使用屏障的需要,所以想知道多线程中的典型用例是什么应用程序。

【问题讨论】:

【参考方案1】:

障碍可以通过人为的示例在任何地方使用,但您通常会在分散/减少方法中看到它们,其中在继续之前需要所有不同线程的结果。

如果您想并行化排序,例如,您可以将列表拆分 n 次并启动 n 个线程以对其部分进行排序并暂停,当它们全部完成时,它们会死,让父级知道最终可以合并排序的块。 (我知道有更好的方法,但这是一种实现)。

我见过的另一个地方是并行网络,您必须在每个负载中发送一定数量的数据。所以接口会启动n个桶并等待它们全部填满,然后再发送传输。当您考虑分区的 T1 线路时,​​它是有道理的,在 64 个多路复用分区上发送一个数据突发比发送 1 个分区的数据要好(这基本上成本相同,因为数据包必须用 0 填充。)

希望这些事情能让你思考这个问题!

【讨论】:

【参考方案2】:

示例:一组线程同时工作以计算结果集,并且需要所述结果集(部分/全部)作为下一阶段处理部分/全部的输入“障碍”上的线程。

屏障可以更轻松地同步多个线程,而无需围绕多个 conditionsmutexes 制定解决方案。

我不能说我经常看到barriers。在某些时候,随着线程数量的增加,可能值得考虑使用更加“解耦”的系统来管理可能的死锁。

【讨论】:

【参考方案3】:

MSDN:Barrier 是一个对象,可防止并行操作中的单个任务继续执行,直到所有任务都到达障碍。当并行操作发生在 阶段,并且每个阶段都需要任务之间的同步。

Found here

【讨论】:

以上是关于在多线程应用程序中使用屏障的真实示例是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在多线程应用程序中使用 aiopg 池?

Java并发包中CyclicBarrier的工作原理使用示例

屏障同步(输出、增量和等待)

在多线程应用程序中同步属性值的正确方法

ZeroMQ 在多线程应用程序中处理中断

Python 2.7 多处理屏障