2014-06-16 8 views
5

의 OpenMP 표준 (< = 4.0)에 대한 atomic 말한다 : expression-stmt는 다음 형식 중 하나를 표현 문은참조 유형에 대한 OpenMP atomic?

#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt

:
...
하는 경우 절이 업데이트되었거나 존재하지 않음 :
x++;
위 식에서 5,...
(적용 가능한 경우)과
xv 스칼라 타입 모두 L 값 식은이다. 내가 올바르게 해석 할 때
...

그래서, 다음의 짧은 코드는 불법입니다 :

int main() 
{ 
    int myCounter = 0; 
    int& reference = myCounter; 

    #pragma omp parallel for 
    for (int i = 0; i < 100; ++i) 
    { 
    #pragma omp atomic 
    reference++; // Increment through reference. 
    } 
    return 0; 
} 

이유 : 따르면 this post에, 참조 (여기 int& reference)되어 있지 스칼라 유형. 그러나이 표준은 atomic을 사용하기 위해서는 하나 여야한다고 명시 적으로 명시하고 있습니다.

코드는 아무런 경고없이 (-Wall -Wextra) g ++로 컴파일됩니다.

제 질문은 : 표준 또는 C++의 "참조 유형"개념을 잘못 이해 했습니까? 그렇지 않으면 atomic의 사용이 심각하게 제한되어 있기 때문에 (기본적으로 참조 또는 참조 해제 된 포인터가 필요하기 때문에 기본적으로 힙에있는 데이터는 atomic의 대상이 될 수 없기 때문에) 대부분의 컴파일러에서이 코드를 컴파일합니까?

답변

5

참조 유형은 스칼라 유형이 아닙니다. 그러나이 사실은 귀하의 질문에 아무런 영향을 미치지 않습니다. 중요한 사실은 스칼라 유형 에 대한 참조를 평가하는 표현식은 스칼라 유형이있는 왼쪽 값인입니다. 구체적으로는, 가변 referenceint& 입력 갖지만 referenceint 가치 범주 좌변 입력 갖는다. 네, 당신의 프로그램은 적합합니다.

+0

많은 설명 주셔서 감사합니다 :) – Gugi

관련 문제