10

我知道 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;
}
4

1 回答 1

2

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

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

以防止错误。

于 2009-05-04T09:07:20.020 回答