Windows API 提供 InterlockedExchange
,它以原子方式在内存中设置一个值。仅使用 GCC 内部函数,我想创建一个与该函数等效的函数。设置值然后调用内存屏障是否足够(参见下面的代码)?
template <typename T>
T InterlockedExchange(volatile T& _data, T _value)
{
const T oldValue = _data;
_data = _value;
__sync_synchronize();
return oldValue;
}
谢谢。
编辑:提议的片段不是问题的正确解决方案,因为它显然不是原子的(但是,好吧,我至少必须试一试).
最佳答案
使用__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);
}
编辑:
哦,我读错了,你想要的是 InterlockedExchange,而不是 InterlockedCompareExchange ... 所以这就是 __sync_lock_test_and_set
(这个名字是一个误导性的 Intel-nomer,但这正是你想要的)。
参见 here , 页面底部。
关于c - 移植 InterlockedExchange,仅使用 GCC 内部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8268243/