2009-07-15 4 views
26

pthread를 사용하는 휴대용 스레드와 비슷한 원자 변수 연산을 위해 C에 (POSIX-) 이식성 방법이 있습니까?UNIX 휴대용 원자 연산

원자 연산은 컨텍스트 스위치가 작업을 방해 할 수 있음을 의미하는 원자 적으로 실행되는 "증가 및 가져 오기"와 같은 연산입니다. 리눅스 커널 공간에서 우리는 atomic_t 타입을 가지고 있고, 자바는 java.util.concurrent.atomic 패키지를 가지고 있습니다.

Linux에서 atomic.h 파일은 원자 적 조작을 제공하지만 포함은 플랫폼에 따라 다릅니다. #include <asm-x86_64/atomic.h>과 비슷한 방식으로 Mac OS X에서 사용할 수 없습니다.

+0

일부 GCC 내장 기능이있다 ([여기에 설명] http://gcc.gnu.org/onlinedocs/gcc-4.5.0/ gcc/Atomic-Builtins.html). – caf

+0

니스, GCC로 제한되어 있지만 괜찮을 것입니다. – dmeister

+0

그리고 여기 더 최신 gcc : http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html – osgx

답변

0

AFAIK 원자 적 조작을 수행 할 수있는 교차 플랫폼 방식은 없습니다. 밖에 도서관이 있을지 모르지만 나는 모른다. 그래도 자신을 굴리는 것은 그리 어렵지 않습니다.

0

나는 없을 것이라고 생각합니다.

당연히 허용되는 라이센스를 해결하는 한 가지 방법은 관련 아키텍처 별 구현을 예를 들어, 리눅스 커널 공간. 나는 그 프리미티브의 진화를 철저히 따라 가지 못했지만 실제로는 그것들이 원시적 인 것, 즉 커널의 다른 서비스 나 API에 의존하지 않는다고 생각한다.

3

아니요, POSIX는 휴대용 자물쇠/원자 적 조작을 지정하지 않습니다. 그것이 그들이 pthreads를 가지고있는 이유입니다.

비표준 방식을 사용해야하거나 이동성을 위해 ptrheads를 사용해야 할 것입니다.

9

당신이 OS X를 요청 이후 :

(크로스 platformity이 스레드에서 제기 된 이후.)

OS X를 기능 OSAtomicAdd32() 친구가 있습니다. 그것들은 "/usr/include/libkern/OSAtomic.h"에 선언되어 있습니다. The Threading Programming guide, "원자 연산 사용"섹션을 참조하십시오.

그리고 Windows에는 InterlockedIncrement() 및 친구들 (MSDN 참조)이 있습니다. 함께 GCC의 내장 명령 __sync_fetch_and_add와

는()과 친구가 (위에 링크 된), 당신은 모든 주요 데스크탑 플랫폼에 대한 뭔가가 있어야한다.

아직 혼자서 사용하지는 않았지만 앞으로 며칠 이내에 그렇게 할 것입니다.

12

미래에 이것에 걸림돌이되는 사람에게는 C11 원자핵이 지금이 작업을 수행하는 가장 좋은 방법입니다. GCC 4.9에 포함될 것입니다.

+8

이것을 확장 할 수 있습니까? – GraphicsMuncher

6

C11부터는 원자 조작을 제공하는 선택 사항 인 Atomic library이 있습니다. 이 옵션 기능을 가진 C11 컴파일러 (예 : gcc-4.9)가있는 플랫폼에 이식 할 수 있습니다.

원자의 존재는 확인할 __STDC_NO_ATOMICS__ 원자 <stdatomic.h>

존재 될 수있다.C

#include <stdio.h> 
#include <stdlib.h> 
#ifndef __STDC_NO_ATOMICS__ 
#include <stdatomic.h> 
#endif 

int main(int argc, char**argv) { 
    _Atomic int a; 
    atomic_init(&a, 42); 
    atomic_store(&a, 5); 
    int b = atomic_load(&a); 
    printf("b = %i\n", b); 

    return EXIT_SUCCESS; 
} 

컴파일러 호출

clang -std=c11 atomic.c 
gcc -std=c11 atomic.c