|
CriticalSection 은 다중 쓰레드를 사용할 때 어떤 메모리의 충돌을 일으키거나 오작동을 하지 않도록 할때
많이 쓰입니다.
한 예로, 1~4번까지의 쓰레드가 있는데, 각기 작동을 하고 있습니다.
전역변수로 int i가 설정돼있는데 네개의 쓰레드가 모두 이 변수를 사용하고 변형시킨다면, 먼저 실행돼는 쓰레드에서 이 변수를 변형시키거나 사용하겠죠? 그럼 이상한현상이 발생할 수 있습니다.
따라서, 이러한 이상한 현상을 막기 위해서 CriticalSection 을 사용하는데, 이것은 임계영역이라고 해서,
이 영역으로 들어오면 이것이 최우선순위로 연산을 하게됍니다. 그렇기때문에 다른 쓰레드는 멈추게돼죠.
그래서 어떤 연산이든지 이 영역으로 오게돼면 다른 쓰레드는 잠시 멈추게돼고 임계영역부터 연산을 해주고, 연산이 끝나서 임계영역을 벗어나게돼면 다시 모든 쓰레드가 동작하게됍니다.
한마디로 하면 CriticalSection은 CPU가 가장 먼저해야할 것을 지정해주는것이라 생각하면 됍니다.
님께서 원하시는 역할을 하지는 않습니다.
님같은 경우에는 쓰레드가 정확하게 멈추어있는건지 쓰레드를 종료시킨것인지를 확인하는게 우선이 아닌가 싶네요. 만약 종료가 아닌 WaitForSingleObject(또는 WaitForMultipleObjects) 같은 함수를 쓰신것인지 확인을 해보세요. 여기서 interval parameter를 INFINITE로 설정하셨다면 time out 시간을 설정해주시면 됩니다.
잘못하면 프로세서가 멈추는 경우가 생기거든요.
그럼 참고하세요
^*^ 님이 쓰신 글 :
: 자동화 관련 프로그램을 짜고 있는데 질문 하나 할려구요.
: 4개의 다른동작을 동시에 하는 쓰레드 4개를 생성했는데...
: 만약 4개중 한쪽쓰레드가 동작하다 멈추는 현상이 발생한다면
: CriticalSection 을 쓰면 해결할수 있는지요.
: 책은 보고 있는데 CriticalSection 을 정확히 어떻게 사용하는지는 잘 모르겠습니다.
: 혹시 써 보신분은 좀 가르쳐 주시면 안되는지....
:
|