2014-04-22 5 views
1

GCC에는 Clang의 기본 제공 __sync_swap()이 없습니다. 나는 그것을 필요로하는 몇 가지 코드를 가지고 있으며 GCC에서 이것을 모방하는 방법을 알아 내려고하고있다. Clang의 문서에 따르면 __sync_* 또는 __atomic_*이라는 단일 조작만큼 간단하지는 않습니다.gcc에서 __sync_swap() 구현

__sync_swap()은 어떻게 GCC에서 조작 될 수 있습니까?

+0

나와 같은 gcc의'__atomic_exchange_n'과 같습니다. – oakad

+0

당신이 옳다고 생각합니다. clang 문서는 오래되어서는 안됩니다. 나는 gcc가'__atomic_ *'을 갖기 전에 지시가 돌아 왔음을 확신한다. –

답변

1

__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의에 의해 구현 된 원자 매크로)를 고려할 수 있습니다 동일한 의미를 갖는다. 최신 내장 기능을 사용할 수없는 경우를 대비하여 나중에는 최후의 수단으로 만 사용됩니다.