참고 : http://blog.naver.com/jwmoon74/100157579221
1. volatile 을 사용하지 않은 변수 : 최적화가 될 수 있다. 재배치(reordering) 될 수 있다.
2. volatile 을 사용한 변수(1.5 미만) : 그 변수 자체에 대해서는 최신의 값이 읽히거나 쓰여진다.
3. volatile 을 사용한 변수(1.5 이상) : 변수 접근까지에 대해 모든 변수들의 상황이 업데이트 되고, 변수가 업데이트 된다.
1.
위와 같은 순서로 프로그램이 실행된다고 할 때(ready는 false로 초기화) volatile이 미적용된 상태에서 예상할 수 있는 문제는
1. answer와 ready의 최적화
2. 실행시간에 캐쉬된 값들이 바로 메인 메모리에 업데이트 되지 않을 수 있음
2번 문장이 실행되었는데 캐쉬만 업데이트 한 뒤, mail memory에 적용되지 않고 3번이 실행되었다면 3번에서 ready가 false로 읽어질 수 있다.
2.(1.5미만)
ready에 volatile이 적용될 경우, ready가 읽혀지거나 쓰여질 때마다 바로 업데이트 된다.
따라서 3번 문장에서 문제가 발생하지 않는다.
answer에 대하여 volatile이 적용되지 않았기에 최신의 answer(2)가 4번 문장에 전달되지 않았을 수 있다.
3.(1.5이상)
ready에 volatile이 걸렸을 경우, ready의 값이 읽혀지거나 쓰여질 때마다, 그 때까지의 쓰레드의 '모든 상태'가 업데이트 된다.
즉, thread 1의 ready가 true로 쓰여질 때,
같은 쓰레드에 있던 answer도 메인메모리에 업데이트 된다.
따라서 3번, 4번도 제대로 값이 읽어지게 된다.
'Software > Programming' 카테고리의 다른 글
static_assert (0) | 2016.06.23 |
---|---|
singleton 패턴과 volatile---DCL(Double Checking Locking) (0) | 2016.04.15 |
volatile(C,C++) (0) | 2016.04.15 |
구조체와 공용체. 공용체의 패딩 (0) | 2015.01.11 |
MFC)버튼을 누르는 동안 지속되는 카운팅 예제 (2) | 2014.10.19 |