검색결과 리스트
volatile에 해당되는 글 1건
- 2012.10.29 C++에서 멀티스레드 프로그래밍 할 때 volatile 변수 사용은 비 추천 (3)
멀티스레드 프로그래밍 관련 글을 보면 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 동작을 한다고 명시하지 않고 있다.
댓글
volatile 을 베리어로 쓰는사람은 없지않을가요...
그렇게 설명된 책은 아직 못본거같은데
volatile 규약에는 베리어 기능이 있다고 정의하지 않은데 플랫폼이나 컴파일러에서 베리어 기능까지 지원하기도 합니다. 그래서 당연히 베리어 기능을 지원한다고 생각하면 안된다는 것입니다. ^^
http://skyul.tistory.com/337 이 글을 참고하면 좋을 것 같습니다.
VC에 그런 기능이 있었군요..
근데 실제 동작은 베리어 안치는것 같던데...
베리어 치면 제가 예전에 경험했던 버그가 설명이 안되는데 음 ... 수동으로 베리어 쳐서 해결했었고