当类型不是Integral时,如何使用std :: atomic执行基本操作?

Noo*_*zen 10 c++ multithreading stdatomic

确切地说,我只需要将双倍增加一倍,并希望它是线程安全的.我不想使用互斥锁,因为执行速度会急剧下降.

Cas*_*sey 17

通常,C++标准库试图仅提供可以高效实现的操作.因为std::atomic,这意味着可以在"通用"架构上的指令或两个指令中无锁地执行的操作."通用"体系结构具有整数的原子提取和添加指令,但不适用于浮点类型.

如果你想为原子浮点类型实现数学运算,你必须自己使用CAS(比较和交换)循环(Live at Coliru):

std::atomic<double> foo{0};

void add_to_foo(double bar) {
  auto current = foo.load();
  while (!foo.compare_exchange_weak(current, current + bar))
    ;
}
Run Code Online (Sandbox Code Playgroud)

  • @Joe`compare_exchange_weak`通过引用获取第一个参数,并在失败时将其更新为观察值。因此,如果CAS因“ foo!= current”而失败,则循环将从更新的“ current”中计算出一个新的“ current + bar”,然后重试。 (2认同)