2009-08-17 4 views
2

두 개의 ManualResetEvent가 있습니다. 두 개의 스레드간에 컨트롤을 앞뒤로 전달하는 데 사용합니다. 근본적으로 코 루틴.WaitHandle.Dispose()를 호출하면 스레드 대기가 어떻게됩니까?

coroutine은 일회용 개체를 보유하기 때문에 (ManualResetEvents는 대기 핸들 임) 일회용을 구현해야합니다. 또한 처리가 끝나면 ManualResetEvent를 처리해야합니다. 그러나 한 번에 하나의 스레드 만 실행되므로 그 중 하나는 항상 핸들 중 하나에서 항상 대기합니다.

두 ManualResetEvents를 모두 처분 할 경우 지정된 동작은 무엇입니까? 대기중인 스레드가 영원히 멈추거나 기다리게 될 것입니까? .Set()을 먼저 호출하면 어떻게 될까요?

답변

0

ManualResetEvents 구현을 암시하는 것은 나쁜 습관입니다. 이벤트가 소유 한 관리자 클래스를 만들고 카운터가 0이 될 때 카운터 패턴 (각 스레드 증가/감소 사용)을 사용하여 감독자를 처분합니다.

+0

이미 스레드를 안전하게 처리 할 수 ​​있다는 것을 알고 있습니다. 문제는 실제로 처분을 수행하는 것입니다. 스레드가 교착 상태가 없음을 보장해야합니다. –

+0

이벤트를 처리하는 방식은 사용되는 동안 다른 플랫폼이나 CPU로드에 따라 예기치 않은 동작을 허용합니다. 그러나 올바른 패턴을 적용하면이 질문을 해결할 수 있습니다. 사용할 수있는 가능성이있는 동안 이벤트를 처리하지 마십시오. – Dewfy

0

최근에 유사한 문제가 있었으며 대기 핸들을 모니터로 교체하기로 결정했습니다. Marc Gravell herehere이 설명하는 대기/펄스 패턴. 모니터 클래스가 완벽하게 관리되므로 리소스를 삭제하는 것에 대해 걱정할 필요가 없습니다. 물론, 당신은 여전히 ​​당신의 셧다운 절차를 생각해 볼 필요가 있을지 모르지만, 대기/펄스 패턴은 셧다운 플래그와 같은 것을 추가하기 위해 좀 더 융통성이있다.

관련 문제