我想知道如何在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;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这个?
我就是这样做的:
//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;
}
Run Code Online (Sandbox Code Playgroud)
如果比较交换函数失败,则会更新oldval值。因此没有必要重复这一点。
正如您所看到的,我更喜欢使用显式原子操作。这是因为完整的并不总是得到实施。正如赫伯·萨特 (Herb Sutter)在这里所解释的那样(您可能也会对视频的其余部分感兴趣:))。
作为一个可能不必要的事后想法,我想警告不要将此函数与非平凡可复制类型一起使用。或“正常”指针。共享指针通常没问题:)。
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |