JDK 的并发包、Boost 的线程库、Perl 的线程库(虽然不是在 Python 中)都实现了屏障,我还没有遇到过使用屏障的需要,所以想知道多线程应用程序中的典型用例是什么。
3 回答
障碍可以通过人为的示例在任何地方使用,但您通常会在分散/减少方法中看到它们,其中在继续之前都需要不同线程的结果。
例如,如果您想并行化排序,则可以将列表拆分 n 次并启动 n 个线程以对其部分进行排序并暂停,当它们全部完成时,它们会死,让父级知道最终可以组合已排序的块。(我知道有更好的方法,但这是一种实现)。
我见过的另一个地方是并行网络,每个有效负载必须发送一定数量的数据。所以接口会启动n个桶并等待它们全部填满,然后再发送传输。当您考虑分区的 T1 线时,它有点道理,在 64 个多路复用分区上发送一个数据突发比发送 1 个分区的数据要好(这基本上成本相同,因为数据包必须用 0 填充。)
希望这些是让您思考问题的一些事情!
示例:一组线程同时工作以计算结果集,并且需要所述结果集(部分/全部)作为“屏障”处的某些/所有线程的下一阶段处理的输入。
屏障可以更轻松地同步多个线程,而无需围绕多个conditions
&制定解决方案mutexes
。
我不能说我barriers
经常看到。在某些时候,随着线程数量的增长,可能值得考虑一个更加“解耦”的系统来管理可能的死锁。
MSDN:Barrier 是一个对象,可防止并行操作中的单个任务继续执行,直到所有任务都到达障碍。当并行操作分阶段发生并且每个阶段都需要任务之间的同步时,它很有用。