코드

2016-11-30 4 views
0

다음과 같은 코드를 생각해코드

int a = 0, b = 0; 
boost::mutex m; 
a++; 
m.lock(); 
m.unlock(); 
b++; 

무엇 잠금 할 그들이 컴파일러 "좋아, 잠시 동안 C++ 표준에 대해 잊지 말 것입니다, 내가 무엇을 최적화 상관 없어 이 경계를 넘어서는 메모리 액세스 순서를 변경하면 안됩니다. " 이는 a++;이 항상 b++; 전에 발생한다는 것을 의미합니까? 또는 잠금 장치 사이에 문이있는 경우 a++ 또는 b++으로 다시 정렬하지 마십시오.

+5

컴파일러가 'a'와'b'가 지역 변수라는 것을 감안할 때 평소와 같이 컴파일러에서 최적화 할 수 있습니다. 주어진 코드에서 다른 스레드가 문제의'int'를 볼 수있는 방법이 없으므로 뮤텍스는 영향을 미치지 않습니다. –

답변

0

질문은 이미 Baum mit Augen의 의견에 잘 답변되어 있습니다. "는이"와 "B"글로벌 변수했고, 그 읽기를 보장 할 수있는 컴파일러에 뮤텍스에 의해 부과 된 메모리 장벽을 따라 휘발성 선언/표현이 가로 질러 다시 정렬되지 않습니다 쓰기 경우

, 경계.

"b"를 읽고 발견 한 스레드가 증가하여 메모리 배리어를 적용하기 위해 비슷한 뮤텍스 잠금을 수행 한 후 "a"를 읽으면 "a"가 또한 수정되었습니다.

MSVC에는이 동작과 일부 다른 컴파일러가 있습니다.