volatile 은 const 와 같이 변수의 특성을 변경 시켜주는 키워드 이다.
사용 빈도가 크지 않아서 진짜 필요할때 사용 못하는 경우가 많다.
volatile 은 두 가지로 변수의 특성을 변경한다.
1, 컴파일러가 컴파일시 최적화를 하지 않는다.
컴파일러가 컴파일 할때 소스를 그대로 컴파일 하여 바이너리로 변환되지 않는다.
컴파일러는 점점 진화 하고 있고, 개발자의 몹쓸 소스들을 자동으로 변경하여 컴파일 한다.
대표적으로 많이들 알고 있는 것은 사칙연산, 반복문을 변경하거나 작성된 소스라인 순서를 변경하기도 한다.
위와 같은 경우 해당 변수가 컴파일러 최적화에 의해 오동작을 방지 하기 위해 사용한다.
2, 메모리 베리어(펜스)를 포함하고 있다.
변수에 값을 대입 할때 (메모리에 write 할때) 항상 공유메모리에 직접 쓰거나 읽지 않고 쓰기버퍼(저장 버퍼)에 값을 임시로 저장했다가 실제 공유메모리에 Write 할수 있다. 이럴경우 멀티스레드 환경에서 메모리를 읽었을때 기대하는 값이 나오지 않을수 있다.
위와 같은경우 해당 변수가 항상 공유메모리를 사용하도록 보장받기 위해서 사용한다.
사용 빈도가 크지 않아서 진짜 필요할때 사용 못하는 경우가 많다.
volatile 은 두 가지로 변수의 특성을 변경한다.
1, 컴파일러가 컴파일시 최적화를 하지 않는다.
컴파일러가 컴파일 할때 소스를 그대로 컴파일 하여 바이너리로 변환되지 않는다.
컴파일러는 점점 진화 하고 있고, 개발자의 몹쓸 소스들을 자동으로 변경하여 컴파일 한다.
대표적으로 많이들 알고 있는 것은 사칙연산, 반복문을 변경하거나 작성된 소스라인 순서를 변경하기도 한다.
위와 같은 경우 해당 변수가 컴파일러 최적화에 의해 오동작을 방지 하기 위해 사용한다.
2, 메모리 베리어(펜스)를 포함하고 있다.
변수에 값을 대입 할때 (메모리에 write 할때) 항상 공유메모리에 직접 쓰거나 읽지 않고 쓰기버퍼(저장 버퍼)에 값을 임시로 저장했다가 실제 공유메모리에 Write 할수 있다. 이럴경우 멀티스레드 환경에서 메모리를 읽었을때 기대하는 값이 나오지 않을수 있다.
위와 같은경우 해당 변수가 항상 공유메모리를 사용하도록 보장받기 위해서 사용한다.
'APIs' 카테고리의 다른 글
void *_alloca(size_t size) (0) | 2009.12.30 |
---|---|
SwitchToThread(void) (0) | 2009.12.29 |