posted by 방랑군 2012. 1. 21. 22:44
멀티 스레드에서 가장 중요한 동기화 시키는 법에 대해 알아보겠습니다.

그중 MunualResetEvent 클래스를 사용해서 하는법을 알아보겠습니다.

ManualResetEvent는 서로 Signal(신호)를 통해 스레드를 작동시키는 것입니다.

그럼 필수적으로 필요한 매소드에 대해 알아보겠습니다.





ManualResetEvent의 Set() = 계속 진행되도록 신호를 받는것
ManualResetEvent의 Reset() = 스레드가 차단되어 이벤트 신호가 더이상없음을 설정하는
ManualResetEvent의 WaitOne() = 신호의 상태를 확인합니다. 
즉 Set()으로 되어있으면 true
Reset()으로 되어있으면 false 
반환합니다.
이라고 생각하시면 됩니다.

소스를 보면서 설명해 보겠습니다.기본 소스 입니다.
MyCalculator로 제가 만든 클래스 입니다.(클릭하면 크게 보입니다.)
ManualResetEvent클래스 변수 control_Thread 를 만든 후 초기화를 false로 했습니다.
WaitOne()함수는 control_Thread의 신호가 false인지,true인지 확인한 합니다.
그 후 for문을 빠져나오고 MultiNum()함수가 끝날 무렵,
반환될 무렵에 control_Thread.Reset()로 설정해 더이상
 보내지는 신호가 없게 인식하도록 하였습니다.
실행해 보면 결과값입니다.
밑에 그림에서 //MyCalculator.control_Thread.Set()을 주석을 사용하였더니 
커맨드 창에 MyCalculator의 MultiNum()함수가 작동을 하는것을 알수있습니다.
왜 작동을 안할까요?? 위 그림 설명을 하면서 마지막 함수가 반환될 때
 control.Thread.Reset() 으로 되어있기 때문입니다.
주석을 지워보았습니다. 
동기화가 모가 되는거냐 라고 하실것 같습니다. 그래서 밑에 더 소스를 추가 해 보겠습니다.
밑에 노란줄있는 부분이 바뀐 소스입니다.
중간에 Thread.Sleep(2000)을 하여 2초간 잠시 모든 스레드가 멈추도록 하였습니다.
그후 다시 MyCalculator.control_Thread.Set()을 호출하여 신호상태를 바꿔났습니다.
결과 물입니다.왼 쪽 결과물은 Thread.Sleep(2000)이 불리기 전이고 
오른쪽은 Thread.Sleep(2000)이 불린뒤 입니다.

저작자 표시 비영리