仅使用GCC内在函数移植InterlockedExchange

qdi*_*dii 4 c port gcc atomic

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)

谢谢.

编辑:建议的片段不是问题的正确解决方案,因为它显然不是原子的(但是,我必须至少尝试一下).

Dam*_*mon 9

使用,而不是.__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,但它正是你想要的).
请参见此处,页面底部.

  • 注意`__sync_lock_test_and_set()`只有Acquire语义,所以这只相当于`InterlockedExchangeAcquire()`.你需要为一个完整的内存屏障添加一个`__sync_synchronize();`,相当于`InterlockedExchange()`. (2认同)