【发布时间】:2015-06-17 00:58:11
【问题描述】:
我想知道如何在 c++11 中实现 compare_and_swap。 这是我尝试过的:
template<typename T>
T compare_and_swap(atomic<T>& reg,T newVal )
{
bool success = false;
T oldVal;
do
{
oldVal = reg.load();
success = reg.compare_exchange_weak(oldVal,newVal);
}while(!success);
return oldVal;
}
有没有更好的方法来实现这个?
【问题讨论】:
-
你应该尝试在codereview.stackexchange.com提问
-
compare_exchange 已经完成了交换,你根本不需要你的包装器。
-
@Mat 否定,compare_exchange 在某些情况下肯定会添加代码行。
需要多次使用 compare_and_swap 语义的情况 -
我不明白你在说什么。 compare_exchange 是 compare_and_swap,只是一个不同的名字。如果您不想要循环,请使用 strong 变体。
-
这个
compare_and_swap不等同于标准compare_exchange_strong。后者可能会失败并返回 false,而前者会循环直到成功。这相当于exchange。事实上,对于没有原子交换指令的 CPU,它是exchange的有效实现。但它的效率有点低:你不应该在循环内load(),因为你从上一次迭代中获得了更新的值。