2011-09-12 2 views
1

숨바꼭질,부스트 상태는 내가 (부스트 스레드) C++에서 스레드 를 작업을 시작하고 난 다음과 같은 상황에서 내 자신을 발견 휘발성 변수를

필요 int 변수 buffered이 휘발성이어야합니다.

은 ...

boost::mutex::scoped_lock lk(monitor); 
while (true) { 
    buffer_not_empty.wait(lk); 
} 

그러나 이것은 부스트 ​​문서에서 예이기 때문에, 내가 뭔가를 누락 될 수 있습니다 : 나는, 컴파일시에,이 같은 최적화를 방지해야한다고 말할 것 이러한 종류의 최적화를 막기에 충분한 잠금/뮤텍스/조건? 자바 좋아해?

+1

'monitor' 잠금은 변수를 보호합니다. 충분 해. –

+0

이것은 java와 같은 것을 의미합니다. 어떤 잠금도 변수를 보호합니다. – Ha11owed

+1

실제로 모든 잠금은 해당 잠금 아래에서 일관되게 액세스되는 모든 변수를 보호합니다. C++ 11은 원자 타입을 통해 lockless 변수를 제공 할 것이지만, AFAIR boost는 그것들을 제공하지 않습니다. 사실, 세부 사항 네임 스페이스의 적어도 일부 유형에 대해서는 AFAIR boost가 제공됩니다. –

답변

5

volatile을 엉망으로 작성하지 않아도됩니다. volatile은 멀티 스레딩과 전혀 관련이 없습니다. 비록 컴파일러가 당신이 언급 한 루프에 물건을 최적화하지 않더라도 CPU가 동일한 최적화를 할 수 있으며 volatile은 CPU에 영향을 미치지 않습니다.

wait에는 필요한 메모리 장벽 지침이 있어야 예상대로 작동합니다.

+0

고마워, 나는 이것에 대한 좋은 정보를 찾을 수 없었다. – Ha11owed