GCC에는 Clang의 기본 제공 __sync_swap()
이 없습니다. 나는 그것을 필요로하는 몇 가지 코드를 가지고 있으며 GCC에서 이것을 모방하는 방법을 알아 내려고하고있다. Clang의 문서에 따르면 __sync_*
또는 __atomic_*
이라는 단일 조작만큼 간단하지는 않습니다.gcc에서 __sync_swap() 구현
__sync_swap()
은 어떻게 GCC에서 조작 될 수 있습니까?
GCC에는 Clang의 기본 제공 __sync_swap()
이 없습니다. 나는 그것을 필요로하는 몇 가지 코드를 가지고 있으며 GCC에서 이것을 모방하는 방법을 알아 내려고하고있다. Clang의 문서에 따르면 __sync_*
또는 __atomic_*
이라는 단일 조작만큼 간단하지는 않습니다.gcc에서 __sync_swap() 구현
__sync_swap()
은 어떻게 GCC에서 조작 될 수 있습니까?
__sync_swap
은 "최신"기본 제공 기능으로 달성 할 수있는 단순한 구식 이름입니다.
#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의 DEVS는 새로운 그 소리의 __c11_atomic_exchange
, GCC의 __atomic_exchange_n
이상 __sync_swap
(그것의 모든) 고려하는 것이 예로부터 매우 분명하다 : 적절한 예 (: http://code.metager.de/source/xref/freebsd/sys/sys/stdatomic.h FreeBSD의에 의해 구현 된 원자 매크로)를 고려할 수 있습니다 동일한 의미를 갖는다. 최신 내장 기능을 사용할 수없는 경우를 대비하여 나중에는 최후의 수단으로 만 사용됩니다.
나와 같은 gcc의'__atomic_exchange_n'과 같습니다. – oakad
당신이 옳다고 생각합니다. clang 문서는 오래되어서는 안됩니다. 나는 gcc가'__atomic_ *'을 갖기 전에 지시가 돌아 왔음을 확신한다. –