2011-11-14 1 views

답변

4

pthreads를 사용하는 경우 올바른 동기화를 위해 volatile이 필요하거나 충분하지 않습니다. 전역 변수에 대한 액세스가 뮤텍스 (또는 다른 동기화 프리미티브)에 의해 적절하게 보호되면 일반 변수로 간단히 선언 할 수 있습니다.

0

때때로 데이터를 휘발성으로 선언하는 것이 좋습니다 (주로 원자 적이며 원자 적 조작으로 작동되는 경우). 그러나 전역 데이터에 대한 액세스를 직렬화하려면 동기화 메커니즘 (예 : mutexes, rwlocks, ...)을 사용하는 것이 매우 중요합니다.

휘발성을 사용하는 진정한 이유는 드뭅니다. 정수 및 특수 원자 조작을 사용할 때.

예를 들어 다음과 같은 이유로 동기화 프리미티브를 사용해야합니다.

-1

휘발성 변수는 외부 변수에서 수정할 수 있기 때문에 컴파일러에게 알려주므로 (읽기/쓰기를 건너 뛰고 레지스터에 넣는 것) 어떤 최적화 작업도해서는 안됩니다. 따라서 여러 스레드가 전역 변수를 사용할 경우 항상 전역 변수를 선언해야합니다.

0

누군가 pthread를 사용할 때 필요하지 않다고 말한 것을 볼 수 있습니다. pthread가 어떻게 그런 경우를 보호하는지 잘 모르겠지만, 멀티 스레드 환경에있는 경우 전역 변수를 "volatile"로 정의하는 것이 중요합니다. 이유는 myrkos가 위에서 말한 것처럼 멀티입니다. thread env는 변수가 이 "외부 적으로"수정 될 수있는 경우입니다. 현대 컴파일은 생각보다 최적화를 더 많이 수행하지만 변수가 변경되지 않는다고 생각하면 코드는 메모리에서 값을 읽지 않습니다. 그러나 변수가 변경 될 수 있습니다.

그러나 글로벌 변수를 제대로 작동 시키려면 충분하지 않습니다. 자동 연산을 사용하거나 뮤텍스를 사용하여 보호해야합니다.

관련 문제