c - 移植 InterlockedExchange,仅使用 GCC 内部函数

标签 c gcc port 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;
}

谢谢。

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

最佳答案

使用__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/

相关文章:

c - 仅打印数组中的唯一元素

C函数返回字符串?

c - 使用相同标志的 clang 和 gcc 的行为差异?

tomcat - 如何检测本地网络中哪些端口未被阻止

http - 如何在 Windows 上解锁端口

windows - 隐藏端口并将http加密为https

c - 在 C 中解码 base64 编码的二进制字符串

c - Linux 读取 strace 记录的系统调用 - 如何理解指向缓冲区值的指针?

c++ - 如何实现 MS 特定的 _BitScanReverse() 函数?

c - 当我们在c中使用fork时,进程之间是否共享数据?