ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++, volatile
    C++/C++ 기타 2022. 10. 9. 14:25
    728x90

    c++에서 volatile의 의미는 컴파일러에게 최적화를 하지 말라는 의미이다.

     

    visual studio에서 실행모드를 release모드로 바꾸고 다음과 같은 코드를 실행해보자.

    출력하는 곳에 중단점을 찍고 디버그를 해서, 디스어셈블리해보면,

    이렇게 나온다.

    a에 값을 할당하는 일련의 코드들이 실행되지않는것이다.

    이는, 컴파일러가 

    "어차피 출력하는 건 a에 3이 들어간것이고, 그 이전의 값은 사용되지도 않는데, 뭐하러 하나??"

    라고 생각하여 최적화한 결과이다.

     

    이 때 volatile 키워드를 사용하면, 다음과같이 변경된다.

     

    a의 값에 1, 2, 3을 차례로 할당해주고 있다.

    그러니까 volatile은

    아니 비효율적인거 아는데, 일부러 한거니까 최적화 하지말고 냅둬!

    라는 것이다.

     

    잘 사용하진 않지만

    대표적인 사용례로는 멀티스레드 환경에서의 프로그래밍할 때 사용하기도 한다.

     

    아주 간단하게 해보면

    lock을 걸었다 풀었다 하는 상황이 이렇게 있을 수 있다.

    void main()
    {
    	bool lock = true;
    	while(lock){}
    
    	lock = false;
    }

    보통 메인함수에 작성하지 않지만, 귀찮으니..

     

    이 경우, 위의 코드를 한 개의 스레드만 실행한다고 가정할 경우에는, lock을 검사할 필요가 없다.

    lock은 언제나 true일 것이기 때문이다.

    따라서, 컴파일러는 최적화를 해서 while문의 조건을 검사하지 않고, 바로 jump한다.

    하지만, 멀티스레드 환경에서는, 다른 스레드가 lock을 false로 설정해줄 수도 있으니, while문을 검사 해야한다.

    이럴 때 volatile키워드를 사용해주면 된다.

    그러면 이렇게, while의 조건을 검사하는 것을 알 수 있다.

    728x90

    댓글

Designed by Tistory.