【问题标题】:Cyclic Barriers for n threads can also handle n*2 threadsn 个线程的 Cyclic Barriers 也可以处理 n*2 个线程
【发布时间】:2018-03-11 23:03:40
【问题描述】:
我已经实现了一个简单的循环障碍,但从快速测试中我意识到,如果你为 2 个线程设置障碍,但有 4 个线程即将到达 barrier.await(),那么你将获得 2 个实例同时在临界区中的线程对。同样,使用 6 个线程会同时在关键部分获得 3 对线程(由于我是新手,所以没有很好地测试过)
我的问题是,如果 n 个线程通过障碍进入临界区,如何在临界区已经在使用时阻止其他组的 n 个线程进入临界区?
提前致谢。
【问题讨论】:
标签:
java
multithreading
cyclicbarrier
【解决方案1】:
第n个线程到达后,所有n个线程将立即被允许越界竞争临界区。 (n+1)'th 到 (2n-1)'th 将再次等待直到第 2n' 个线程到达屏障,一旦到达,所有 (n+1)' th 到 2n' th 将一起穿过屏障并且争夺临界区。
您可以将 AtomicInteger 初始化为 0,并在您的关键部分之前每次递增它。还要检查它的值是否变为 n,然后阻塞/退出/返回所有其他线程。
顺便说一句,只有 AtomicInteger 递增并检查它是否已变为 n,就足够了,允许 n 个线程,并保持拒绝,如果使用 Cyclic Barrier 将在这里做的是,将导致所有第一个 n 线程竞争关键部分在一起。 (如果只有一个线程应该执行代码部分,则只将其称为临界区,否则将其称为“n 线程允许区域”)
就像在餐桌上等着吃饭的人要等到至少 n 人才能吃饭,一旦有 n 人,就可以一起跳上晚餐 :)