文章中有一段代码
int c;
if ((c = cmpxchg (val, 0, 1)) != 0) {
//something
}
// cmpxchg(var, old, new): The content of the variable var will be replaced with
// new if the current value is old. Regardless, the current value of var before the
// operation is returned.
std 中没有这样的 CAS 指令实现...
我试图模拟这段代码:
std::uint32_t с = 0;
if ((с = std::atomic_compare_exchange_strong(&val, &c, 1) ? 0 : 1) != 0) {
//something
}
这有多正确?
编辑:待回答
std::uint32_t с = 0;
if (!std::atomic_compare_exchange_strong(&val, &c, 1)) {
//something
}
它看起来是正确的(虽然是歪的),但它可以更简单:
atomic_compare_exchange_strong()
本身交换变量的值并返回旧值,不像cmpxchg()
,根据使用情况判断,它只为变量分配一个新值(前提是旧值没有改变)并返回旧值。在这种情况下,显式分配一个值с
是不必要的,而且可能是不正确的。最有可能的是,
*_strong
在这种情况下它更可取,但具体使用什么取决于算法:atomic_compare_exchange_weak()
不同的是,*_strong
即使变量的值等于旧值并返回,它也可能不会交换false
。在 x86 上,如果有的话,没有区别。