问题标签 [cyclicbarrier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1154 浏览

java - 多线程应用程序随着线程数量增加运行时间

我正在为 N-Body 问题实现 Barnes-Hut 算法的多线程解决方案。

主类执行以下操作

bh.stop- 和 bh.startBarrier 是 CyclicBarriers 将 start- 和 stopTime 设置为 System.nanoTime(); 到达时(障碍动作)。

工人运行方法:

addForce(i) 遍历一棵树并进行一些计算。它不会影响任何共享变量,因此不使用同步。O(NlogN)。

moveBody(i) 对一个元素进行计算并且不使用同步。上)。

当达到 bh.barrier 时,就会建立一个包含所有实体的树(屏障动作)。

现在来解决问题。运行时间随着使用的线程数线性增加。gnumBodies = 240,numSteps = 85000 和四个核心的运行时:

  • 1 个线程 = 0.763
  • 2 个线程 = 0.952
  • 3 个线程 = 1.261
  • 4 个线程 = 1.563

为什么运行时不会随着使用的线程数而减少?

编辑:添加硬件信息

0 投票
2 回答
174 浏览

java - 为什么 ExecutorService 不能一致地调度线程?

我正在尝试使用CyclicBarrier对我来说是新的来重新实现我的并发代码。我可以不用它,但我正在对我的其他解决方案进行试验,我遇到的问题是使用以下代码出现死锁情况:

我使用 Android Studio (intelliJ) 中的调试器在此阶段暂停执行。我得到多个线程显示我的await调用作为我要执行的最后一个代码

->Unsafe.park

->LockSupport.park

->AbstractQueuedSynchronizer$ConditionObject.await

->CyclicBarrier.doWait

->CyclicBarrier.await

至少一个线程将具有此堆栈:

-> Unsafe.park

->LockSupport.park

->AbstractQueuedSynchronizer$ConditionObject.await

->LinkedBlockingQueue.take

->ThreadPoolExecutor.getTask

->ThreadPoolExecutor.runWorker

->ThreadPoolExecutor$Worker.run

->Thread.run

我注意到CyclicBarrier在后面的这些杂散线程中没有任何作用。

processCommons 正在调用exec.invokeAll(在 3 个侦听器上),我想这意味着我的线程用完了。但是很多时候这并没有发生,所以请有人澄清为什么ExecutorService不能始终如一地安排我的线程?他们有自己的堆栈和程序计数器,所以我认为这不是问题。我一次最多只能运行 4 个。有人帮我做数学吗?

0 投票
2 回答
158 浏览

java - 为什么我的 cyclicBarrier 为空?

我了解 ciclycbarrier 并尝试创建一个小应用程序。我的应用程序的构造函数如下:

在构造函数中,我创建了我的 Cyclicbarrier,设置了一个 maxDownload 数字和一个新的 Runnable。在那之后,你创建了我所有的线程设置一个任务(设置循环障碍。任务实现可运行)。我的任务代码如下:

但问题是当方法 DownloadFile(Inside Run of my task) 结束时,是时候做 cb.await,我有下一个错误:

和调试我可以看到我的任务中的 cyclicbarrier(barrier) 始终为空,但 cb 不是。

可能是什么问题?在此处输入图像描述

0 投票
1 回答
245 浏览

java - 使用 CyclicBarrier 在 barrier.await() 之后线程没有继续

请帮我处理我的代码。我正在使用比赛起点和终点线有 2 个点进行比赛。所有的马都从大门口出发,向大门口前进。比赛只有在所有马匹都到达大门后才开始。最先完成的人赢得比赛。

0 投票
0 回答
189 浏览

java - 使用 CyclicBarriers 时如何正确停止线程

我必须使用许多线程对缓存进行操作,因此创建了 3 个从 Thread 扩展的类(我现在意识到它们也可以是 Runnables,或者应该是)。请注意,这些我正在运行这些线程之一的多个实例,但不是同时运行。如:

所以在我完成这个之后,我为第二个操作(随机)创建新线程。以下是我的 run 方法的创建方式。
我利用循环障碍来等待线程同时工作。

主线程专注于运行这些线程多长时间,并且在该时间结束时,我尝试在处理第二个操作之前停止线程。但似乎我的线程实际上并没有停止。

编辑:我应该注意我已经尝试直接中断线程。并试图重置障碍,从其他线程上找到的答案来看,这两种做法似乎都是不好的做法。

我使用 ExecutorService 来按顺序管理这些操作。

但是 executorservice 并没有转到下一个。

0 投票
2 回答
65 浏览

events - 3 个队列 + 所有队列的 1 个完成或设备端检查点

是否有一个特殊的“等待事件”功能可以在设备端同时等待 3 个队列,因此它不会从主机端连续等待所有队列?

是否有要发送到命令队列的检查点命令,以便它必须等待其他命令队列击中相同(垂直)屏障/检查点以等待并从设备端继续,因此不需要主机端往返?

目前,我尝试了两个不同的版本:

第二个要快一些(我从别人那里看到的),两者都是在 3 个刷新命令之后执行的。

查看 CodeXL 分析器结果,第一个在完成点之间等待的时间更长,一些操作似乎甚至没有重叠。第二个显示 3 个完成点都在 3 毫秒内,因此它更快并且更长的部分重叠(同时读取 + 写入 + 计算)。

如果有一种方法可以通过主机端的 1 个等待命令来实现这一点,那么它也必须有一个“刷新”版本,但我找不到。

有没有办法实现下图而不是在每个管道步骤之间添加刷新?

所有检查点都必须垂直同步,并且在发出信号之前,所有这些操作都不得开始。如:

检查点都在设备端处理,主机端只需要 3 个完成命令(更好,所有队列只需要 1 个完成?)

如何使用“clWaitForEvents(3, evt_);”将 3 个队列绑定到 3 个事件 现在是:

如果这个“排队障碍”可以与其他队列交谈,我怎么能做到这一点?在所有队列完成之前,我是否需要保持主机端事件处于活动状态,或者我可以删除它们或稍后重新使用它们?从文档来看,似乎第一个屏障事件可以放入第二个队列,第二个屏障事件可以与第一个事件一起放入第三个,所以可能是这样的:

有人试过这个吗?我是否应该以障碍开始所有队列,以便在我从主机端引发一些事件之前它们不会开始,或者“入队”的延迟执行是 %100 可信任到“直到我刷新/完成”它们才开始?如何从主机向设备引发事件(sameEvt 没有“引发”功能,是 clCreateUserEvent 吗?)?

所有 3 个队列都是有序类型并且在相同的上下文中。并非所有显卡都支持乱序类型。正在使用 C++ 绑定。

还有 enqueueWaitList(是否已弃用?)和 clEnqueueMarker 但我不知道如何使用它们,并且文档在 Khronos 的网站上没有任何示例。

0 投票
0 回答
219 浏览

java - 使用 CyclicBarrier 的并发生命游戏

我有一个代表生命游戏板的二维数组。N线程在数组的自己的部分工作,创建下一代。

当所有N的锁都用完后,我打印当前一代并在进入下一代之前休眠一段时间。它是通过使用来实现的CyclicBarrier

尽管该程序有效,但我认为打印线程可能会看到陈旧的数组单元,因为对数组的写入不同步。内部CyclicBarrier使用锁,所以它可能会触发happens-before,但我不确定。

我看到的唯一解决方案是锁定Board方法。但我不想使用锁,因为每个线程都有自己专用的数组部分,它会在锁上产生不必要的争用。

0 投票
1 回答
5861 浏览

multithreading - CountDownLatch 中的 await() 的目的是什么?

我有以下程序,我正在使用java.util.concurrent.CountDownLatch并且不使用await()方法它工作正常。

我是并发新手,想知道await(). 在CyclicBarrier我可以理解为什么await()需要,但为什么在CountDownLatch

CountDownLatchSimple

Runner实现Runnable

输出

二是等待。
三是等待。
一是等待。
一个已完成。
二是完成。
三是完成。

0 投票
2 回答
675 浏览

java - CyclicBarrier 是否会在最后一次等待时自行重置?

我倾向于CyclicBarrier并且我写了这个演示。

正如我所料,该程序打印了五个tripped并退出。

我的问题是CyclicBarrier实例在最后一次await()到达时自行重置?所以输出是预期的?我找不到任何形容词。

0 投票
1 回答
292 浏览

java - CyclicBarrier 死锁?

我对 CyclicBarrier 的以下代码有疑问。

我的问题是,当我在两个级别上使用 CyclicBarrier 运行此代码时,它似乎总是陷入僵局。然而,当我在 1 级或 3 级使用 CyclicBarrier 运行代码时,即 new CyclicBarrier(1) 或 new CyclicBarrier(3),它总是成功完成。那么二级有什么问题呢?