寻找类似 fetch_add 的atomic<double>之类的东西

Mah*_*ell 2 c++ multithreading c++11

我正在寻找某种适用于原子双精度的加法操作。可悲的是:

myatomdouble += toadddouble;
Run Code Online (Sandbox Code Playgroud)

没有定义,

myatomdouble = myatomdouble + toadddouble;
Run Code Online (Sandbox Code Playgroud)

被多线程搞砸了,并且 fetch_add 仅适用于整型,但不适用于双精度型。但像 fetch_add 这样的东西正是我所需要的。:(

每次尝试修改变量时都进行互斥会使程序变得超慢,代码不可读,并且破坏了原子的思想。

那么这个问题有没有办法解决呢?

bam*_*s53 5

您可以按照对通用对象实现任何原子修改的方式来实现这一点。

template<typename T>
T atomic_fetch_add(std::atomic<T> *obj, T arg) {
  T expected = obj->load();
  while(!atomic_compare_exchange_weak(obj, &expected, expected + arg))
    ;
  return expected;
}
Run Code Online (Sandbox Code Playgroud)

尽管不能保证atomic<double>不使用互斥体,所以您必须检查您的实现。