是什么意思AtomicIntegerArray和AtomicInteger[]?哪一个更快使用?(我注意到的只是第一个占用更少的空间,但这意味着每次重新检查都会检查数组的边界,这会使它变慢?)
编辑:在阵列预先初始化的情况下.
我正在用C++编写一个程序来执行特定系统的模拟.对于每个时间步长,执行的最大部分是由单个循环占用.幸运的是,这是非常平行的,所以我决定使用Boost Threads并行化它(我在2核机器上运行).我期望加速接近串行版本的2倍,因为没有锁定.但是我发现根本没有加速.
我实现了循环的并行版本如下:
然后每个线程执行以下操作:
主线程等待工作完成障碍.
我使用这种方法,因为它应该提供良好的负载平衡(因为每次计算可能需要不同的时间量).我真的很好奇可能导致这种放缓的原因.我总是读到原子变量很快,但现在我开始怀疑它们是否有性能成本.
如果有人有什么想法或任何提示,我会非常感激.我一直在抨击它一个星期,并且剖析没有透露太多.
编辑:问题解决了! 我将详细说明我是如何解决这个问题的.我再次使用gprof,但这次编译时没有优化标志(-O3).然后,分析器立即表明我在函数中花费了不可思议的时间,该函数对每个单独的粒子执行计算:远远超过串行版本.
此功能是虚拟的,可以多态访问.我改变了代码直接访问它,而不是通过vtable和voila'并行版本产生了近2的加速!串行版本的相同更改几乎没有影响.
我不知道为什么会这样,如果有人知道的话会感兴趣!
感谢所有的海报.你们都在某种程度上有所帮助,接受一个答案是非常困难的.
parallel-processing performance multithreading boost-thread atomic-values
嘿,我正在科特林学习原子。我想知道在我的场景中使用原子布尔值是个好主意吗?有人可以建议如何以原子方式进行。
场景 1非首次通话
var isFirstTime = true
fun notForFirstTime(){
if(!isFirstTime){
jobDone()
}
isFirstTime = false
}
Run Code Online (Sandbox Code Playgroud)
场景2仅限第一次
var isFirstTime = true
fun onlyForFirstTime(){
if(isFirstTime){
jobDone()
}
isFirstTime = false
}
Run Code Online (Sandbox Code Playgroud)
我可以以原子方式做到这一点吗?这也是个好主意吗?
我需要确保特定的启动和停止代码在每个实例生命周期只执行一次,并且实例不能“重新启动”。以下代码是否适用于多个线程可能作用于实例的场景?
public final class MyRunnable {
private final AtomicBoolean active = new AtomicBoolean(false);
private final AtomicBoolean closed = new AtomicBoolean(false);
public void start() {
if (closed.get()) {
throw new IllegalStateException("Already closed!");
}
if (active.get()) {
throw new IllegalStateException("Already running!");
}
active.set(true);
// My one-time start code.
// My runnable code.
}
public void stop() {
if (closed.get()) {
throw new IllegalStateException("Already stopped!");
}
if (!active.get()) {
throw new IllegalStateException("Stopping or already stopped!");
}
active.set(false);
// My one-time stop code.
closed.set(true); …Run Code Online (Sandbox Code Playgroud)