trax님 블로그에 인용안되었으면 그냥 넘어갔겠지만, trax님까지 잘못된 내용을 알고 계신 듯하여 다시 글을 씁니다.
const와 같이 따라다니는 변수형인 volatile은 실제로 문제에 접해보기 전엔 사용에 대한 필요성을 못느끼는 변수형입니다. const는 초기화 이후에는 데이타 의 변형이 불가능하게 됩니다. 반대적인 개념이 volatile이란 변수형입니다.
보통 PC에서 단일 task, process, thread (통칭 process라 하겠슴)에서는 사용할 필요를 느끼지 못하는 변수형입니다. 자 그럼 셋탑에서의 단일 process에 인터럽트 루틴이 있는 경우, 또는 multi-process인데 공용 메모리 (쉽게 전역변수)를 사용하는 경우에 그 변수를 volatile로 선언해두지 않으면 곤란한 경우를 당하게 됩니다. 로직엔 아무런 이상이 없는데 버그가 나오게 되죠.
인터럽트 루틴이 있는 단일 process의 경우를 먼저 예로 들면, is_lock이란 전역변수가 있습니다. 메인 루틴에서 변수를 셋팅하고 다음 코드를 수행하려 할때 인터럽트루틴이 호출되어 is_lock이란 변수를 바꾸어 놓습니다. 인터럽트 루틴이 끝나고 메인 루틴의 다음 코드로 넘어가게 되서 if (is_lock)이라고 해봅시다. 이때 인터럽트 루틴에서 바꾸어 놓은 결과가 반영되지 않는 경우가 발생합니다. 이런 경우 대부분 CPU에서 캐쉬를 사용 하는 경우이죠. 이때 이 변수를 volatile로 선언해 놓으면 변수를 참조할때마다 메모리에서 다시 reload하게 됩니다. 이해가 되셨는지…
multi-process에 공용메모리를 사용하는 경우도 위와 동일한 이유로 사용합니다.
(명사형 전성어미 ‘ㅁ’을 써서 ‘하겠음’이라고 써야하는 것을 ‘하겠슴’으로 쓴 부분을 제외하고라도) 이 설명은 완전히 잘못되었습니다. 먼저 이글을 읽어보시고, 다음 Scott Myers의 글을 읽어보세요.
comp.programming.threads의 글 역시 도움이 될 것입니다.
C나 C++ 자체에는 쓰레딩의 개념이 없습니다. 먼저 C의 경우.
The C language defines a series of “sequence points” in the “abstract
language model” at which variable values must be consistent with language
rules.
C++의 경우.
> The C++ standard does not deal with multiple threads of
> execution. So, the answer is “it depends on your threading
> environment”.
쓰레딩과 언어가 합체한 것은 자바나 C# 같은 언어의 경우일 뿐입니다. (C++의 경우엔 스트라우스트롭 아저씨가 그렇게 원하는 모든걸 다하는 general 한 언어를 위한 선택이죠. C++은 모든 문제를 풀 수 있게 할 뿐, 직접 문제를 풀지는 않는다는 거죠. 그래서 쓰레드는 C++의 일부가 아닙니다.)
volatile은 sequence points와만 상관이 있는데, 하필이면 그 sequence points는 가상의 단일 쓰레드를 가진 프로세서를 전제합니다. 따라서 멀티쓰레드 동기화와 상관이 없습니다.
volatile은 하드웨어와 연관될때나 의미가 있습니다. 쓰레딩의 해결에 쓰시면 안됩니다. volatile은 기껐해야 컴파일러 최적화만 막을 뿐 입니다. MMU의 동작은 메모리 베리어를 통해 해결해야하며 메모리 베리어의 삽입을 가장 간단히 하는 것은 synchronization construct 뿐입니다. 오죽하면 volatile을 갖고 comp.programming.threads에서 brain-dead 라고 하겠어요. 혹시 갖고 계신 책, 보고 있는 article에서 volatile은 멀티 쓰레딩을 위한 것이라고 나와있다면, 그 책/article이 잘못된 것입니다.
혹시라도 제 설명이 잘못되었다고 여겨지신다면 comp.programming.threads에 포스팅하고 주소를 알려주시면 감사하겠습니다.