n个线程的循环屏障也可以处理n*2个线程

Cyclic Barriers for n threads can also handle n*2 threads

我已经实现了一个简单的循环屏障,但是通过快速测试我意识到如果你为 2 个线程设置一个屏障,但是有 4 个线程即将到达 barrier.await() 那么你将同时在关键部分获得 2 个线程对实例。类似地,使用 6 个线程将同时在关键部分获得 3 对线程(由于我是新手,还没有测试得很好)

我的问题是,如果n个线程通过屏障进入临界区,当临界区已经被使用时,如何阻止其他n组线程进入临界区?

提前致谢。

当第n个线程到达后,所有n个线程都会立即被允许越过屏障竞争临界区。第 (n+1) 到 (2n-1)' 将再次等待,直到第 2n' 个线程到达屏障,一旦到达,所有第 (n+1) 到第 2n' 将一起越过屏障并且争夺临界区。 您可以将 AtomicInteger 初始化为 0,并在每次关键部分之前递增它。还要检查它的值是否变为 n,然后 block/exit/return 所有其他线程。

顺便说一下,只有 AtomicInteger 递增并检查它已经变成 n,就足够了,允许 n 个线程,剩下的拒绝,循环屏障在这里做的是,如果使用,将导致所有前 n 个线程一起争夺临界区。 (如果只有一个线程应该执行代码部分,那么只称它为临界区,否则称它为 "n thread allowed region ") 就像等着吃饭的人 table 直到至少有 n 个人才允许吃饭,一旦有 n 个人,所有人都可以一起跳上晚餐:)