[완료] volatile과 mutex에 대해서...
글쓴이: mg2000 / 작성시간: 월, 2008/12/15 - 1:51오후
안녕하세요.
제가 멀티스레드 프로그래밍에 대해서 공부하다 아래와 같은 글을 봤는데요.
Quote:
* Outside a critical section, any thread might interrupt any other at any time; there is no control, so consequently variables accessible from multiple threads are volatile. This is in keeping with the original intent of volatile — that of preventing the compiler from unwittingly caching values used by multiple threads at once.
* Inside a critical section defined by a mutex, only one thread has access. Consequently, inside a critical section, the executing code has single-threaded semantics. The controlled variable is not volatile anymore — you can remove the volatile qualifier.
원문: http://www.ddj.com/cpp/184403766
크리티컬 섹션 밖에서는 volatile을 유지해야 하고, 크리티컬 섹션 안에서는 single-thread프로그램과 다를바 없으니,
volatile를 떠어버려도 된다는 이야기 같은데...
그렇다면, 제가 만든 클래스를 여러 클래스에서 공유해서 사용하도록 할 생각인데,
이 클래스를 사용할때, mutex로 Lock/Unlock만 잘 시켜준다면 제가 선언한 오브젝트를 volatile로 선언할
필요가 없는건가요?
원문 전체 내용을 보면 그게 아니것 같기도 하고... 헷갈리네요.
Forums:
네. 원문내용과 동일하게 이해하셨습니다.
volatile 키워드의 사용목적은 컴파일러가 생성하는 불필요해 보이는(?) 코드에 대한 최적화를 하지 않도록 하는것입니다.
예 1)
SomeStaticData = 3;
SomeStaticData = 3;
위 예처럼 저 두개의 문장은 언뜻보기에는 하나의 문장만 있어도 상관없죠.
하지만 다음 예를 봅니다.
예 2)
[ 실행컨텍스트 A - (ex : 어떤 응용프로그램 코드이고 쓰레드 A 라고 가정하죠~~) ]
SomeStaticData = 3; /* 여기서 실행컨텍스트 B로 스위칭될수 있다고 가정해요 ~ */
SomeStaticData = 3;
[ 실행컨텍스트 B - (ex : 어떤 인터럽트 핸들러 혹은 쓰레드 B 라고 가정하죠~~. 즉 실행컨텍스트 A와는 다른 컨텍스트입니다) ]
SomeStaticData = 0;
실행컨텍스트 A의 두번째 문장은 불필요해보이지만, 첫번째 문장에서 3을 대입후, 다른 컨텍스트에서 0으로 초기화가 될수 있음으로
분명 두개의 문장 모두가 필요합니다.
하지만 실행컨텍스트 A에서 뮤텍스등으로 임계영역을 설정하면 , 실행컨텍스트가 쓰레드인경우 그사이에 실행컨텍스트 B로 스위칭될가능성이 없음으로 volatile 선언은 필요없습니다.
원문의 내용은 그 얘기구요. 하지만 실행컨테스트가 인터럽트 핸들러라면, 임계영역이 설정되어도 스위칭됨으로, volatile 키워드가 필요하겠죠.
정리하면, 컴파일러는 기본적으로 코드는 동시에 하나의 컨텍스트만이 실행한다고 가정하고 최적화를 하는데,
하지만, 실제로 여러개의 컨텍스트가 동시에 변수를 공유하게 된다면, volatile 변수를 사용하거나, 다른방법을 고려해 보셔야 합니다.
얘기가 길었는데, 결론은 원문을 제대로 이해하신겁니다.
도움되셨기를...
답변 감사합니다.
많이 배우고 갑니다. ^^
댓글 달기