Volatile 키워드

volatile 은 변덕스러운 이라는 뜻으로 사용되는듯하다.

이는 요즘 컴파일러가 워낙 최적화를 잘하다 보니까 최적화 과정에서 우리가 원치 않던 코드를 생성하는 경우가 있는데 이를 방지하고자 하는 키워드 이다.

MyStruct *mystruct;
while(!myStruct->flag))
{
    //some work
}

와 같은 코드가 있을때 컴파일러가 원치 않게 최적화 해버려서

MyStruct * mystruct;
if(!myStruct->flag)
{
    while(1)
    {
        //some work
    }
}

이렇게 바뀌게된다.

실제로 myStruct→flag 가 만약 sensor 값으로 언제 변할지 모르는 값이라고 할때 컴파일러의 최적화에 의해서 그런 변화를 감지하지 못하고 while 루프안에 갖혀버리게된다.

따라서 이러한 경우 컴파일러 최적화기능을 끄기는 잃는게 너무 많기 때문에 volatile 키워드를 사용하게된다.

volatile MyStruct *myStruct;

다음과 같이 volatile 키워드를 붙여주면 컴파일러는 myStruct 에 대해서 최적화기능을 끄게 되는것이다.

즉 외부 요인에 의해 변수값이 변경될 가능성이 있는(변덕스러운) 변수는 최적화기능을 끄기 위해 volatile 키워드를 사용하는 것이다.

  • 멀티 쓰레드
  • 인터럽스 서비스 루틴
  • Memory-map I/O
  • 등…