【问题标题】:Better way to implement a generic atomic load or store in GCC?在 GCC 中实现通用原子加载或存储的更好方法?
【发布时间】:2010-10-23 06:27:12
【问题描述】:

我知道 GCC 的内置原子操作:http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html

但此列表不包括加载和存储等非常简单的操作。我可以通过内联汇编在有限的架构上实现这些(实际上对于许多像 x86 这样的架构来说,它们基本上只是常规的 mov),但在一般情况下,没有比这样更好的方法了:

// returns the value at ptr
void *atomic_load_ptr(void **ptr)
{
    return __sync_fetch_and_add(ptr, 0);
}

// returns old value int ptr after setting it to newval
void *atomic_store_ptr(void **ptr, void *newval)
{
    void *oldval = atomic_load_ptr(ptr)
    void *oldval2;
    do {
        oldval2 = oldval;
    } while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);
    return oldval;
}

【问题讨论】:

  • 如果我错了,请阻止我,但是您的“存储”函数并不是真正的存储,因为它返回旧值(因此它非常接近 CAS)。
  • 它实际上是一个“交换”——存储一个新值并在需要时返回之前的值。
  • 我发现这个加载实现有一个问题:不能在只读内存上使用。

标签: c gcc atomic


【解决方案1】:

您可以使用 test_and_set 实现低级互斥锁。 load 函数是一个很好的 imo,但是你的 store 函数应该使用 test_and_set 而不是

while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);

防止出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多