表达式"a == 1?1:0"与比较加三元运算符表达式原子?

Wha*_*rld 2 c++ java pthreads atomic

快问题?这条线在C++和Java中是原子的吗?

class foo {
  bool test() {
    // Is this line atomic?
    return a==1 ? 1 : 0;
  }

  int a;
}
Run Code Online (Sandbox Code Playgroud)

如果有多个线程访问该行,我们最终可能首先检查a == 1,然后更新a,然后返回,对吗?

补充:我没有完成课程,当然,还有其他部分更新...

Col*_*lin 8

不,对于C++和Java.

在Java中,您需要以相同的方式创建方法synchronized并保护其他用途a.确保在所有情况下都在同一对象上进行同步.

在C++中,您需要使用std::mutex保护a,可能使用std::lock_guard以确保在函数结束时正确解锁互斥锁.

  • `a`没有以任何方式更新,为什么`synchronized`会有帮助? (4认同)
  • `AtomicBoolean`?可能的竞争条件不是使用布尔值,而是使用整数值 (2认同)

Ali*_*iBZ 7

return a==1 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

是一种简单的写作方式

if(a == 1)
    return 1;
else
    return 0;
Run Code Online (Sandbox Code Playgroud)

我没有看到任何更新的代码.但我想你可以搞清楚.


Pet*_*ker 5

无论是否存在写入,在C++中读取非原子类型的值都不是原子操作.如果没有写入,那么你可能不在乎它是否是原子的; 如果某个其他线程可能正在修改该值,那么您肯定会关心.