【问题标题】: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 人,就可以一起跳上晚餐 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-03
      • 2018-09-25
      • 2021-12-18
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 2015-08-19
      • 2021-12-30
      相关资源
      最近更新 更多