寻找类似fetch_add的原子<double> </double>

时间:2014-04-17 15:56:55

标签: c++ multithreading c++11

我正在寻找某种处理原子双打的添加操作。 遗憾的是:

myatomdouble += toadddouble;

未定义,

myatomdouble = myatomdouble + toadddouble;

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

并且每次尝试修改变量都会使程序失败,代码不可读并破坏原子的概念。

这个问题还有解决办法吗?

1 个答案:

答案 0 :(得分:4)

您可以按照对通用对象实施任何原子修改的方式实现此目的。

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;
}

虽然不能保证atomic<double>不使用互斥锁,但您必须检查实施情况。