2013-10-30 4 views
2

volatile 사용에 관한 질문이 있습니다. 일반적으로 스레드간에 공유되는 모든 변수는 직접 메모리 액세스를 보장하기 위해 volatile 키워드를 가지며 물론 뮤텍스로 보호됩니다.다중 스레드 응용 프로그램의 휘발성 C/C++

그러나 일관성을 보장하기 위해 변수를 공유하는 경우 volatile이 실제로 필요합니까?

내가 예와 함께 설명 :

Thread1: //(affects it behaviour with the variable) 
mymutex.lock(); 
if(variable) 
{ 
    ... 
    variable = false; 
} 
mymutex.unlock(); 
위의 예에서
Thread2: 
mymutex.lock(); 
variable = true; 
mymutex.unlock(); 

, thread2 만 쓰고, thread1는 읽기/쓰기. variable이 캐시되고 스레드가 새 값을 읽을 수 없습니까? 뮤텍스가 제대로 설정 되었더라도? 이 경우 volatile이 필요합니까?

변수 대신에 휘발성 일 수없는 std::vector이 있기 때문에이 질문을드립니다. 그리고이 방법이 volatile 키워드 없이는 안전하다고 100 % 확신하지 못했습니다.

감사합니다.

EDITED : 질문을 올바르게 재구성합니다.

+6

만큼 변수에 대한 액세스가 뮤텍스에 의해 보호로 사용, 보증 스레드 안전을 시도 휘발성 사용할 수 있습니다하지 말라 http://stackoverflow.com/questions/11172922/does-stdmutex-create-a-fence) –

+0

그래서, 귀하의 의견을 파생. 뮤텍스/세마포어/CriticalSection 내에서 액세스되는 모든 변수는 잠금 해제 된 후에 플러시되고 다른 스레드에서 볼 수 있습니까? – DarkZeros

+0

@DarkZeros 정확! 그것이 작동하는 방법입니다. –

답변

5

volatile은 동시성을위한 것이 아닙니다. 그것은 컴파일러가 변수로부터 읽는 것을 최적화 할 수 있는지 없는지에 관한 것입니다. 이것은 주로 메모리 맵핑을 통해 하드웨어와 인터페이싱하는 것과 같은 것에 사용됩니다.

불행하게도 이것은 즉, volatile 개의 변수가 있어도 읽기 및 쓰기가 동기화되지 않은 스레드 로컬 저장소에 계속 액세스 할 수 있음을 의미합니다. 또한 std::vector은 스레드로부터 안전하지 않습니다.

따라서 두 경우 모두 동기화해야합니다 (예 : std::mutex). 자, 이것이 완료되면, mutex에 의해 보호되는 변수는 volatile 일 필요는 없습니다. mutex 자체는 동기화를 수행하고 걱정되는 유형의 문제를 방지합니다.

+2

정답. 나는 단지 이미 말한 것을 강조하고자한다 : "휘발성"은 스레드 동기화가 아니다. 누구나 스레드를 동기화하기 위해 휘발성을 사용하면 코드가 여전히 틀릴 확률은> 90 %이지만 느린 속도가됩니다. Ofc에는 스레딩에서 volatile을 사용할 수있는 유효한 컨텍스트가 있지만 매우 적고 일반적으로 저수준 동기화 기본 요소 (예 : 스핀 록)를 구현할 때 유용합니다. – ultimA

+0

감사합니다. "데이터를 공유하기 위해 휘발성을 사용하지 마십시오"라는 많은 답변을 발견했습니다. 분명히 뮤텍스가없는 휘발성 데이터 만 공유하려고하지는 않습니다. 나는 항상 공유를 위해 뮤텍스를 사용한다. 내 질문은 "데이터가 휘발성없이 플러시됩니까?"입니다. 이것은 내가 찾고 있던 것이 분명하다. – DarkZeros

+0

@DarkZeros 적절한 동기화를 사용하면 다른 스레드의 작업이 인터리브 된 것처럼 효과가 나타납니다. 인터리브 된 방법과 다른 스레드가 작성한 값이 사용자의 제어 범위를 벗어나는 경우 그러나 휘발성은 변경되지 않으므로 추가하면 문제가 해결되지 않습니다. – Agentlien

0

내 대답 here을보십시오. [당신은`volatile` 사용하지 않아도]을 (-

바닥과 같은 영리 적절한

관련 문제