代码之家  ›  专栏  ›  技术社区  ›  Greg Rogers

在GCC中实现通用原子加载或存储的更好方法?

  •  10
  • Greg Rogers  · 技术社区  · 17 年前

    我了解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;
    }
    
    1 回复  |  直到 17 年前
        1
  •  2
  •   claf    17 年前

    可以使用test_和_set实现低级别互斥。在我看来,加载函数是一个很好的函数,但是存储函数应该使用test_和_set,而不是

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

    以防止错误。

    推荐文章