问题标签 [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.
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
为什么运行时不会随着使用的线程数而减少?
编辑:添加硬件信息
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 个。有人帮我做数学吗?
java - 使用 CyclicBarrier 在 barrier.await() 之后线程没有继续
请帮我处理我的代码。我正在使用比赛起点和终点线有 2 个点进行比赛。所有的马都从大门口出发,向大门口前进。比赛只有在所有马匹都到达大门后才开始。最先完成的人赢得比赛。
java - 使用 CyclicBarriers 时如何正确停止线程
我必须使用许多线程对缓存进行操作,因此创建了 3 个从 Thread 扩展的类(我现在意识到它们也可以是 Runnables,或者应该是)。请注意,这些我正在运行这些线程之一的多个实例,但不是同时运行。如:
所以在我完成这个之后,我为第二个操作(随机)创建新线程。以下是我的 run 方法的创建方式。
我利用循环障碍来等待线程同时工作。
主线程专注于运行这些线程多长时间,并且在该时间结束时,我尝试在处理第二个操作之前停止线程。但似乎我的线程实际上并没有停止。
编辑:我应该注意我已经尝试直接中断线程。并试图重置障碍,从其他线程上找到的答案来看,这两种做法似乎都是不好的做法。
我使用 ExecutorService 来按顺序管理这些操作。
但是 executorservice 并没有转到下一个。
events - 3 个队列 + 所有队列的 1 个完成或设备端检查点
是否有一个特殊的“等待事件”功能可以在设备端同时等待 3 个队列,因此它不会从主机端连续等待所有队列?
是否有要发送到命令队列的检查点命令,以便它必须等待其他命令队列击中相同(垂直)屏障/检查点以等待并从设备端继续,因此不需要主机端往返?
目前,我尝试了两个不同的版本:
和
第二个要快一些(我从别人那里看到的),两者都是在 3 个刷新命令之后执行的。
查看 CodeXL 分析器结果,第一个在完成点之间等待的时间更长,一些操作似乎甚至没有重叠。第二个显示 3 个完成点都在 3 毫秒内,因此它更快并且更长的部分重叠(同时读取 + 写入 + 计算)。
如果有一种方法可以通过主机端的 1 个等待命令来实现这一点,那么它也必须有一个“刷新”版本,但我找不到。
有没有办法实现下图而不是在每个管道步骤之间添加刷新?
所有检查点都必须垂直同步,并且在发出信号之前,所有这些操作都不得开始。如:
检查点都在设备端处理,主机端只需要 3 个完成命令(更好,所有队列只需要 1 个完成?)
如何使用“clWaitForEvents(3, evt_);”将 3 个队列绑定到 3 个事件 现在是:
如果这个“排队障碍”可以与其他队列交谈,我怎么能做到这一点?在所有队列完成之前,我是否需要保持主机端事件处于活动状态,或者我可以删除它们或稍后重新使用它们?从文档来看,似乎第一个屏障事件可以放入第二个队列,第二个屏障事件可以与第一个事件一起放入第三个,所以可能是这样的:
有人试过这个吗?我是否应该以障碍开始所有队列,以便在我从主机端引发一些事件之前它们不会开始,或者“入队”的延迟执行是 %100 可信任到“直到我刷新/完成”它们才开始?如何从主机向设备引发事件(sameEvt 没有“引发”功能,是 clCreateUserEvent 吗?)?
所有 3 个队列都是有序类型并且在相同的上下文中。并非所有显卡都支持乱序类型。正在使用 C++ 绑定。
还有 enqueueWaitList(是否已弃用?)和 clEnqueueMarker 但我不知道如何使用它们,并且文档在 Khronos 的网站上没有任何示例。
java - 使用 CyclicBarrier 的并发生命游戏
我有一个代表生命游戏板的二维数组。N
线程在数组的自己的部分工作,创建下一代。
当所有N
的锁都用完后,我打印当前一代并在进入下一代之前休眠一段时间。它是通过使用来实现的CyclicBarrier
。
尽管该程序有效,但我认为打印线程可能会看到陈旧的数组单元,因为对数组的写入不同步。内部CyclicBarrier
使用锁,所以它可能会触发happens-before
,但我不确定。
我看到的唯一解决方案是锁定Board
方法。但我不想使用锁,因为每个线程都有自己专用的数组部分,它会在锁上产生不必要的争用。
multithreading - CountDownLatch 中的 await() 的目的是什么?
我有以下程序,我正在使用java.util.concurrent.CountDownLatch
并且不使用await()
方法它工作正常。
我是并发新手,想知道await()
. 在CyclicBarrier
我可以理解为什么await()
需要,但为什么在CountDownLatch
?
类CountDownLatchSimple
:
类Runner
实现Runnable
:
输出
二是等待。
三是等待。
一是等待。
一个已完成。
二是完成。
三是完成。
java - CyclicBarrier 是否会在最后一次等待时自行重置?
我倾向于CyclicBarrier并且我写了这个演示。
正如我所料,该程序打印了五个tripped
并退出。
我的问题是CyclicBarrier
实例在最后一次await()
到达时自行重置?所以输出是预期的?我找不到任何形容词。
java - CyclicBarrier 死锁?
我对 CyclicBarrier 的以下代码有疑问。
我的问题是,当我在两个级别上使用 CyclicBarrier 运行此代码时,它似乎总是陷入僵局。然而,当我在 1 级或 3 级使用 CyclicBarrier 运行代码时,即 new CyclicBarrier(1) 或 new CyclicBarrier(3),它总是成功完成。那么二级有什么问题呢?