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
(完全可用(具有相同的语义。后者仅作为最后的选择,以防无法使用较新的内置组件。