标签: atomic-values

AtomicIntegerArray与AtomicInteger []

是什么意思AtomicIntegerArrayAtomicInteger[]?哪一个更快使用?(我注意到的只是第一个占用更少的空间,但这意味着每次重新检查都会检查数组的边界,这会使它变慢?)

编辑:在阵列预先初始化的情况下.

java concurrency atomic-values

14
推荐指数
2
解决办法
5276
查看次数

并行版本的循环不比串行版本快

我正在用C++编写一个程序来执行特定系统的模拟.对于每个时间步长,执行的最大部分是由单个循环占用.幸运的是,这是非常平行的,所以我决定使用Boost Threads并行化它(我在2核机器上运行).我期望加速接近串行版本的2倍,因为没有锁定.但是我发现根本没有加速.

我实现了循环的并行版本如下:

  • 唤醒两个线程(它们被阻挡在屏障上).
  • 然后每个线程执行以下操作:

    • 以原子方式获取并递增全局计数器.
    • 使用该索引检索粒子.
    • 对该粒子执行计算,将结果存储在单独的数组中
    • 等待工作完成障碍
  • 主线程等待工作完成障碍.

我使用这种方法,因为它应该提供良好的负载平衡(因为每次计算可能需要不同的时间量).我真的很好奇可能导致这种放缓的原因.我总是读到原子变量很快,但现在我开始怀疑它们是否有性能成本.

如果有人有什么想法或任何提示,我会非常感激.我一直在抨击它一个星期,并且剖析没有透露太多.

编辑:问题解决了! 我将详细说明我是如何解决这个问题的.我再次使用gprof,但这次编译时没有优化标志(-O3).然后,分析器立即表明我在函数中花费了不可思议的时间,该函数对每个单独的粒子执行计算:远远超过串行版本.

此功能是虚拟的,可以多态访问.我改变了代码直接访问它,而不是通过vtable和voila'并行版本产生了近2的加速!串行版本的相同更改几乎没有影响.

我不知道为什么会这样,如果有人知道的话会感兴趣!

感谢所有的海报.你们都在某种程度上有所帮助,接受一个答案是非常困难的.

parallel-processing performance multithreading boost-thread atomic-values

5
推荐指数
1
解决办法
524
查看次数

在 kotlin 中使用原子布尔值是个好主意吗?

嘿,我正在科特林学习原子。我想知道在我的场景中使用原子布尔值是个好主意吗?有人可以建议如何以原子方式进行。

场景 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)

我可以以原子方式做到这一点吗?这也是个好主意吗?

concurrency atomic-values compare-and-swap kotlin

3
推荐指数
1
解决办法
4750
查看次数

使用 AtomicBoolean 控制实例的状态

我需要确保特定的启动和停止代码在每个实例生命周期只执行一次,并且实例不能“重新启动”。以下代码是否适用于多个线程可能作用于实例的场景?

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)

java concurrency lifecycle atomic-values

0
推荐指数
1
解决办法
338
查看次数