Windows API提供InterlockedExchange,它以原子方式在内存中设置值.仅使用GCC内在函数,我想创建一个等效的函数.设置值然后调用内存屏障就足够了(参见下面的代码)?
template <typename T>
T InterlockedExchange(volatile T& _data, T _value)
{
const T oldValue = _data;
_data = _value;
__sync_synchronize();
return oldValue;
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
编辑:建议的片段不是问题的正确解决方案,因为它显然不是原子的(但是,我必须至少尝试一下).
使用,而不是.__sync_val_compare_and_swap__sync_lock_test_and_set__sync_synchronize
这与InterlockedExchange具有完全相同的功能.
像这样的东西(未经测试的代码!):
template<typename T> T InterlockedExchange(T& data, T& new_val)
{
return __sync_lock_test_and_set(&data, new_val);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
Oi,我读错了,你想要InterlockedExchange,而不是InterlockedCompareExchange ......所以这就是__sync_lock_test_and_set(这个名字是误导性的Intel-nomer,但它正是你想要的).
请参见此处,页面底部.