본문 바로가기

IT/C#, NHibernate

C# _ 멀티스레드,ManualResetEvent,동기화 를 시켜보자

반응형
멀티 스레드에서 가장 중요한 동기화 시키는 법에 대해 알아보겠습니다.

그중 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)이 불린뒤 입니다.