스레드 사용 중에 volatile 키워드가 어떻게 동작하는 지 알아보려고 몇 가지 예제를 만들었습니다.
첨부한 예제 중에 다른 예제들은 예상한대로 동작을 하고 있는데요.
ValueUpdateTest 예제에서 이해할 수 없는 결과가 나와서 질문드립니다.
첨부한 내용을 보시면 바로 아시겠지만
Release로 빌드된 예제를 Ctrl + F5나 실행 파일로 실행해보면
메인 메서드 내부에
p._seed = 0;
이 코드가 동작하지 않는 것처럼 보입니다.
몇 번을 돌려봐도 마찬가지이고
Sleep을 짧게 줘서 t1의 동작이 실행 중인 상황에서는
p._seed 에 다른 값을 할당해도 들어가지 않네요.
그런데 이상한 건 CMD 창을 껐다 다시 켰을 때 최초 실행에서는 정상적으로
p._seed = 0 이 값이 할당 되는 것으로 표시됩니다. 그래서 JITter의 영향을 의심했는데
그 이후에는 매우 간헐적으로 p._seed = 0 이 할당되는 것으로 확인되어서
JITter 의 영향이라고 확신할 수가 없네요.
(JITter 문제라 해도 정확히 뭐가 문제인지는 모르겠습니다.)
대다수의 경우에는 t1의 for 루프 내부의 연산된 값이 표시되는 것으로 보입니다.
IL을 확인해봐도 분명히 p._seed에 0을 할당하는 구문이 생성되어 있는데요.
혹시나 해서 디버그 빌드 후 BP를 걸어서 확인해봤는데
디버그에서도 p._seed = 0; 할당문 직후에 값을 확인해 보면
0이 들어가지 않은 것으로 표시됩니다. (for 루프의 연산 중인 값이 표시됩니다)
점점 머릿속이 복잡해지는데요.
다른 예제에서 스레드가 Program 인스턴스의 필드를 사용하는 경우
참조로 전달된 인스턴스가 값복사 한 것처럼 동작하는 것은 또 어떻게 이해해야하는지
ValueUpdateTest 예제에서 스레드 별 메모리 영역이 동기화 되지 않는 다고 하더라도
메인 스레드가 직접 할당하는 값이 무시되는 것처럼 보이는게 이해가 잘 안 됩니다.
스레드 동작 방식과 스레드에 전달한 파라미터의 관계 자체가 다시 이해가 안 되기 시작합니다.
이쯤되면 스레드 사용하기가 점점 무서워지는데요.
volatile 키워드 없이 동기화를 하는 것이 정상 동작하는 지도 의심이 됩니다.
테스트 환경은 Win7 64bit i7 920에 6G 메모리 입니다.
도움 부탁 드립니다.
[최초 등록일: ]
[최종 수정일: 4/12/2013]