准确地说,我只需要将一个 double 再增加一个 double 并希望它是线程安全的。我不想为此使用互斥锁,因为执行速度会大大降低。
问问题
6742 次
2 回答
18
作为一项规则,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))
;
}
于 2014-04-16T18:02:35.327 回答
-1
所以使用积分原子作为内存屏障。这是一个带有来源和解释的页面:http: //preshing.com/20121019/this-is-why-they-call-it-a-weakly-ordered-cpu/
于 2014-04-16T18:01:06.073 回答