static int cnt = 0;
에서의 cnt
는 thread1
, thread2
에 의해 사용되는 shared variable 이다.
단지 scope이 thread라는 함수에 한정지어졌을 뿐이다.
변수를 선언할 때 앞에 volatile을 붙이면 컴파일러는 해당 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 만듭니다.
volatile int num1 = 10;
// 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 만듦
volatile로 선언한 변수는 사용할 때 항상 메모리에 접근합니다. 즉, 이 변수는 언제든지 값이 바뀔 수 있으니까 항상 메모리에 접근하라고 컴파일러에게 알려주는 것입니다.
즉, 컴파일러한테, 네 멋대로 해석하지 말지어다! 라고 알려주는 것이다
CMU 교수님 왈
It tells the compiler never to put that variable in a register
외부 interrupt가 일어나도 괜찮은지, 동시에 접근해도 괜찮은지, 주소를 넘겨줘도 괜찮은지 등은 코드의 실행환경/맥락에 따라 달라진다.
P and V is a Kernel function