繁体   English   中英

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

[英]Better way to implement a generic atomic load or store in GCC?

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

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

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

防止错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM