我想知道如何在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;
}
有没有更好的方法来实现这一目标?
最佳答案
这就是我将如何做到的:
//untested code
template<typename T>
T compare_and_swap(atomic<T>& reg,T newVal )
{
oldVal = atomic_load(reg);
while(!atomic_compare_exchange_weak(®, &oldVal, newVal));
return oldVal;
}
如果失败,比较交换函数将更新 oldval 值。因此没有必要重复这一点。
如您所见,我更喜欢使用显式原子操作。这是因为并不总是实现完整的。正如 Herb Sutter here 所解释的那样(视频的其余部分也可能会让您感兴趣:))。
作为一个可能不必要的事后想法,我想警告不要将此函数与非 trivially copyable 类型一起使用。或“正常”指针。共享指针通常没问题:)。
关于c++ - 如何在C++ 11中实现CAS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29576134/