2012. 1. 21. 22:44
멀티 스레드에서 가장 중요한 동기화 시키는 법에 대해 알아보겠습니다.
그중 MunualResetEvent 클래스를 사용해서 하는법을 알아보겠습니다.
ManualResetEvent는 서로 Signal(신호)를 통해 스레드를 작동시키는 것입니다.
그럼 필수적으로 필요한 매소드에 대해 알아보겠습니다.
ManualResetEvent의 Set() = 계속 진행되도록 신호를 받는것
ManualResetEvent의 Reset() = 스레드가 차단되어 이벤트 신호가 더이상없음을 설정하는
ManualResetEvent의 WaitOne() = 신호의 상태를 확인합니다.
밑에 그림에서 //MyCalculator.control_Thread.Set()을 주석을 사용하였더니
커맨드 창에 MyCalculator의 MultiNum()함수가 작동을 안하는것을 알수있습니다.
왜 작동을 안할까요?? 위 그림 설명을 하면서 마지막 함수가 반환될 때
control.Thread.Reset() 으로 되어있기 때문입니다.
주석을 지워보았습니다.
동기화가 모가 되는거냐 라고 하실것 같습니다. 그래서 밑에 더 소스를 추가 해 보겠습니다.
밑에 노란줄있는 부분이 바뀐 소스입니다.
중간에 Thread.Sleep(2000)을 하여 2초간 잠시 모든 스레드가 멈추도록 하였습니다.
그후 다시 MyCalculator.control_Thread.Set()을 호출하여 신호상태를 바꿔났습니다.
결과 물입니다.왼 쪽 결과물은 Thread.Sleep(2000)이 불리기 전이고
오른쪽은 Thread.Sleep(2000)이 불린뒤 입니다.
그중 MunualResetEvent 클래스를 사용해서 하는법을 알아보겠습니다.
ManualResetEvent는 서로 Signal(신호)를 통해 스레드를 작동시키는 것입니다.
그럼 필수적으로 필요한 매소드에 대해 알아보겠습니다.
ManualResetEvent의 Set() = 계속 진행되도록 신호를 받는것
ManualResetEvent의 Reset() = 스레드가 차단되어 이벤트 신호가 더이상없음을 설정하는
ManualResetEvent의 WaitOne() = 신호의 상태를 확인합니다.
즉 Set()으로 되어있으면 true
Reset()으로 되어있으면 false
반환합니다.
Reset()으로 되어있으면 false
반환합니다.
이라고 생각하시면 됩니다.
소스를 보면서 설명해 보겠습니다.기본 소스 입니다. MyCalculator로 제가 만든 클래스 입니다.(클릭하면 크게 보입니다.)
ManualResetEvent클래스 변수 control_Thread 를 만든 후 초기화를 false로 했습니다.
WaitOne()함수는 control_Thread의 신호가 false인지,true인지 확인한 합니다.
그 후 for문을 빠져나오고 MultiNum()함수가 끝날 무렵,
반환될 무렵에 control_Thread.Reset()로 설정해 더이상
보내지는 신호가 없게 인식하도록 하였습니다.
실행해 보면 결과값입니다.소스를 보면서 설명해 보겠습니다.기본 소스 입니다. 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)이 불린뒤 입니다.
'강좌 > C#' 카테고리의 다른 글
IEnumerable, IEnumerator (0) | 2012.01.21 |
---|---|
스레드 일시정지, 재시작 구현(ManualResetEvent 이용) (0) | 2012.01.21 |
스레드 동기화를 위한 AutoResetEvent와 ManualResetEvent (0) | 2012.01.21 |
_문자열 마샬링 (0) | 2012.01.21 |
_플랫폼 호출 데이터 형식 (0) | 2012.01.21 |