2016-07-04 2 views
1

예를 들어,할당은 C11 원자의 의미는 무엇입니까?

atomic_int test(void) 
{ 
    atomic_int tmp = ATOMIC_VAR_INIT(14); 
    tmp = 47;     // Looks like atomic_store 
    atomic_int mc;    // Probably just uninitialised data 
    memcpy(&mc,&tmp,sizeof(mc)); // Probably equivalent to a copy 
    tmp = mc + 4;    // Arithmetic 
    return tmp;     // A copy - perhaps load then store 
} 

연타이 모든 행복입니다. 표준 7.17 절을 읽었으며 메모리 모델과 정의 된 함수 (init, store, load 등)에 대해 많이 말했지만 일반적인 작업 (+, = 등)에 대해서는 아무 것도 말하지 않습니다.

또한 기능에 struct wot { atomic_int value; }을 전달하는 동작이 중요합니다.

저는 할당이 memory_order_seq_cst를 사용하여 원자 적로드와 동일하게 동작한다고 생각합니다.

더 낙천적으로, 구조체 할당, 함수 전달, 함수 반환 및 memcpy조차도 신중하게 memory_order_seq_cst 아래의 비트 패턴 복사와 동일하게 동작한다고 생각합니다.

표준에 대한 어느 쪽의 믿음에 대한 근거도 찾을 수 없습니다. 원자 기본 요소의 할당과 memcpy가 정의되지 않은 동작이라는 확실한 기회가 있습니다.

원자 기본 요소의 원시 연산은 어떻게 작동해야합니까?

감사합니다.

답변

3

_Atomic 수식 (및 이에 대한 atomic_int은 다른 작성일뿐입니다)에 대한 작업은 순차적 일관성을 보장합니다. 각 피연산자에 대한 의미 섹션의 끝에 언급 된 것을 찾을 수 있습니다. 그것은 있지만, (크기가 일치하지 않을 수 있습니다) 정의되지 않는다 초기화가 ATOMIC_VAR_INIT 매크로 (7.17.2.1)를 사용해야하며, memcpy :

귀하의 코드는 두 개의 장소에서 올바르지 않습니다. (그리고 어쩌면 할당에 대한 언급이 없습니다) 아마도 대부분의 아키텍처에서 작동 할 것입니다.

또한 라인

tmp = mc + 4;    // Arithmetic 

어떤 의견을 주장하지 않습니다. 이것은 원자 적 객체에 대한 산술 연산이 아니라 일반적인 가산 연산에 의한 연산입니다. 더 흥미로운 것은 순차적 인 일관성을 갖는 원자 적 연산 인

mc += 4;    // Arithmetic 

입니다.

+0

고마워요! 일반적인 크기와 정렬 제약 조건이 충족되면 _Atomic 유형에 memcpy가 정의되어 있습니까? 위의 예제는 두 개의 _Atomic int 사이의 memcpy이며 서로 크기가 동일하지만 memcpy와 정렬 된 char 배열을 _Atomic 필드에 포기하는 캡슐화 기법으로 사용하는 경향이 있습니다. 구조체 내에서. –

+0

아니요, '_Atomic'에 대한 액세스는 연산자 또는 함수를 통과하는 경우에만 유효합니다. 분명히'memcpy'를하고 있다면 원 자성을 보장 할 수 없다. –

+0

감사합니다. 나는 이걸로 일할 수 있다고 생각해. –