2011-11-03 4 views
2

std::atomic이 사용 가능할 때까지 변수를 원자 적으로 증분하는 다중 플랫폼 (windows &) 방법은 무엇입니까?다중 플랫폼 원자 증분

현재 boost::detail::atomic_count을 사용하고 있지만 boost::detail 네임 스페이스에 있으며 안전하게 사용해도되는지 잘 모르겠습니다.

+1

당신이 현재 언더 리뷰 [Boost.Atomic] 봤어 (http://www.chaoticmind.net/~ hcb/projects/boost.atomic/doc/index.html) 라이브러리? – ildjarn

+1

'std :: atomic'이 이미 사용 가능합니다. 아니? –

+0

MSVC와 GCC는 모두 std :: atomic 지원을 갖습니다. http://www.stdthread.co.uk – Eloff

답변

2

멀티 플랫폼이지만 컴파일러 특정 방법은 GCC의 __sync_fetch_and_add을 사용하는 것입니다.

또는 조건부 컴파일의 비트와 함께 같은 함수 자신을 정의

#ifdef __GNUC__ 
#define atomic_inc(ptr) __sync_fetch_and_add ((ptr), 1) 
#elif defined (_WIN32) 
#define atomic_inc(ptr) InterlockedIncrement ((ptr)) 
#else 
#error "Need some more porting work here" 
#endif 
+4

__sync_fetch_and_add 및 MSVC InterlockedIncrement는 반환 유형에서 동일하지 않습니다. __sync_fetch_and_add는 ptr의 * 이전 값을 반환하고 InterlockedIncrement는 증가 된 ptr의 결과 값을 반환합니다. 사용하고자하는 것은 "__sync_add_and_fetch"가 동일하거나 호환 될 수 있다는 것입니다. –

+0

또한 InterlockedIncrement는 32 비트 값 전용입니다. – rubenvb