在gcc中实现__syncswap()


GCC缺少Clang的内置__sync_swap()。我有一些代码需要它,我正试图找出在GCC中模仿它的方法。Clang文档暗示这并不像单个__sync_*__atomic_*操作那么简单。

__sync_swap()在GCC中如何被模拟?

__sync_swap似乎只是一个老式的名称,表示可以通过更多"最新"的内置程序实现的功能。让我们考虑一个恰当的例子(freebsd实现的原子宏:http://code.metager.de/source/xref/freebsd/sys/sys/stdatomic.h):

#if defined(__CLANG_ATOMICS)
....
#define atomic_exchange_explicit(object, desired, order) 
    __c11_atomic_exchange(object, desired, order)
....
#elif defined(__GNUC_ATOMICS)
....
#define atomic_exchange_explicit(object, desired, order) 
    __atomic_exchange_n(&(object)->__val, desired, order)
....
#else
....
#if __has_builtin(__sync_swap)
/* Clang provides a full-barrier atomic exchange - use it if available. */
#define atomic_exchange_explicit(object, desired, order) 
    ((void)(order), __sync_swap(&(object)->__val, desired))
....

从这个例子中可以清楚地看出,freebsd开发人员认为较新的clang的__c11_atomic_exchange、gcc的__atomic_exchange_n和较旧的__sync_swap(完全可用(具有相同的语义。后者仅作为最后的选择,以防无法使用较新的内置组件。

相关内容

  • 没有找到相关文章

最新更新