멀티스레드 프로그래밍 관련 글을 보면 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
  • Lyn 2012.10.29 13:23 ADDR EDIT/DEL REPLY

    volatile 을 베리어로 쓰는사람은 없지않을가요...

    그렇게 설명된 책은 아직 못본거같은데

    • 흥배 2012.10.29 21:03 신고 EDIT/DEL

      volatile 규약에는 베리어 기능이 있다고 정의하지 않은데 플랫폼이나 컴파일러에서 베리어 기능까지 지원하기도 합니다. 그래서 당연히 베리어 기능을 지원한다고 생각하면 안된다는 것입니다. ^^
      http://skyul.tistory.com/337 이 글을 참고하면 좋을 것 같습니다.

  • Lyn 2012.10.29 22:01 ADDR EDIT/DEL REPLY

    VC에 그런 기능이 있었군요..
    근데 실제 동작은 베리어 안치는것 같던데...

    베리어 치면 제가 예전에 경험했던 버그가 설명이 안되는데 음 ... 수동으로 베리어 쳐서 해결했었고