멀티스레드 프로그래밍 관련 글을 보면 volatile 키워드에 대한 설명을 종종 볼수 있는데 제가 알기로 실제 사용하는 경우는 별로 없을 거라고 생각합니다. 왜냐하면 이미 이 키워드를 사용할 변수를 크리티컬섹션이나 Interlocked 등을 사용하고 있기 때문이죠.

 

지금까지 사용하지 않았다면 계속 사용하지 말고, 사용하고 있다면 다시 한번 생각하기 바랍니다.

 

이유는 volatile 변수는 C++ 언어 사양에서 Memory Barrier 기능을 한다고 명확하게 정의 되어 있지 않기 때문에 만약 Memory Barrier 기능까지 염두에 두고 있다면 사용하고 있는 컴파일러나 플랫폼에서 지원하는지 꼭 확인해야 합니다.

 

Memory Barrier 설명 http://jacking.tistory.com/309

 

 

volatile 키워드를 사용해야 할 곳이 있다면 C++11에서는 atomic 변수를 사용하고, C++03 이전의 컴파일러에서는 각 컴파일러나 플랫폼에서 제공하는 것을 사용하는 것이 좋습니다.

 

 

C++ 언어 규격 문서를 보면

C++03에서는 언어 규격 상 '스레드' 정의가 없다. C++03은 싱글 스레드 환경만을 생각하고 규격을 정의했다. 멀티스레드 관련 부분은 각 컴파일러마다 독자적으로 구현.

 

C++11에서는 '서로 다른 스레드 간에 순서 관계가 정의 되지 않은 메모리 읽기 쓰기 조작은 data race에 의한 알 수 없는 동작을 한다' 라고 되어 있다. C++11에서 volatile 변수는 Memory Barrier 동작을 한다고 명시하지 않고 있다.

 

 

저작자 표시
신고
by 흥배 2012.10.29 09:30
| 1 |