我正在寻找某种处理原子双打的添加操作。 遗憾的是:
myatomdouble += toadddouble;
未定义,
myatomdouble = myatomdouble + toadddouble;
被多线程搞砸了,fetch_add仅适用于整数类型,但不适用于双精度类型。但是像fetch_add这样的东西正是我需要的。 :(
并且每次尝试修改变量都会使程序失败,代码不可读并破坏原子的概念。
这个问题还有解决办法吗?
答案 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>
不使用互斥锁,但您必须检查实施情况。