모니터 대신 autoresetevent 및 manualresetevent는 언제 사용합니까? wait ()/monitor.pulse ()?
-
03-07-2019 - |
문제
둘 다 같은 목적을 달성하는 것 같습니다. 언제 다른 하나를 선택했을까요?
해결책
무언가를하기 위해 여러 이벤트 중 하나 또는 모든 이벤트 중 하나를 기다리는 스레드가있을 때 이벤트를 사용하십시오.
액세스 할 수있는 스레드 수를 제한하여 데이터 구조에 대한 액세스를 제한하려면 모니터를 사용하십시오.
모니터는 일반적으로 자원을 보호하는 반면, 이벤트는 응용 프로그램 종료와 같은 일이 일어나고 있다고 말합니다.
또한 이벤트의 이름을 지정할 수 있으며 (Openexisting 메소드 참조) 다른 프로세스에서 동기화에 사용할 수 있습니다.
다른 팁
내 생각에, 모니터를 사용하는 것이 좋습니다. Wait 및 Monitor.pulse/pulseall은 스레드 간의 신호 전달에 사용되지만 (수동/Autoresetevent와 마찬가지로) 모니터는 더 빠르며 기본 시스템 리소스를 사용하지 않습니다. 또한 모니터는 사용자 모드에서 구현되며 관리되는 반면, 수동/AutoreseteVents는 커널 모드로 전환해야하고 P/는 대기 핸들을 사용하는 기본 Win32 통화로 호출해야합니다.
예를 들어, 명명 된 이벤트를 사용할 수있는 프로세스간에 신호를 보내기 위해 수동/autoresetevent를 사용해야하는 상황이 있으며 앱의 기본 스레드를 신호하는 것 같습니다.
나는 단지 내가 읽은 것을 역류하고 있습니다 이 훌륭한 기사 스레딩에 대해.
전체 기사는 읽을 가치가 있지만 링크는 이벤트를 자세히 설명하고 대기/펄스를 모니터링하는 대기 핸들 섹션으로 이동합니다.
당신은 a를 사용할 것입니다 WaitHandle
스레드가 이진 신호를 보내거나 받기를 원할 때 없이 중요한 섹션이 필요합니다. Monitor.Wait
그리고 Monitor.Pulse
반면에 필요하다 중요한 섹션. BCL의 대부분의 동기화 메커니즘과 마찬가지로 언급 한 두 가지를 사용하는 방법에는 약간의 중첩이 있습니다. 그러나 그들이 같은 목적을 달성한다고 생각하지 마십시오.
Monitor.Wait
그리고 Monitor.Pulse
MRE보다 훨씬 더 원시적 인 동기화 메커니즘입니다. 실제로, 당신은 실제로 MRE를 구축하거나 Monitor
수업. 이해해야 할 가장 중요한 개념은 방법입니다 Monitor.Wait
그리고 WaitHandle.WaitOne
방법이 다릅니다. Wait
그리고 WaitOne
둘 다 실을 넣습니다 WaitSleepJoin
스레드가 유휴 상태가되어 어느 쪽에만 응답 함을 의미합니다. Thread.Interrupt
또는 각각 Pulse
또는 Set
전화. 그러나 이것은 큰 차이입니다. Wait
중요한 섹션을 남겨두고 재사용합니다 원자 적 방식으로. WaitOne
단순히 이것을 할 수 없습니다. 이러한 동기화 메커니즘이 사용될 수있는 시나리오를 정의하는 방식에 근본적인 차이입니다.
대부분의 상황에서 당신은 MRE를 선택하거나 선택할 것입니다. 이는 한 스레드가 다른 스레드로부터 신호를 수신 해야하는 대부분의 상황을 충족시킵니다. 그러나 자신의 신호 메커니즘을 만들려면 사용해야합니다. Wait
그리고 Pulse
. 그러나, .NET BCL에는 이미 인기있는 신호 메커니즘이 이미 다루어졌습니다. 다음과 같은 신호 메커니즘이 이미 존재합니다1.
- ManualResetevent (또는 ManualReseteVentslim)
- autoresetevent
- 세마포어 (또는 세마포 레 슬림)
- EventWaitHandle
- 카운트 다운 이벤트
- 장벽
1명예로운 언급은 다음에 간다 BlockingCollection
수업. 신호 메커니즘 자체는 아니지만 신호에 데이터를 첨부 할 수있는 이점이 추가 된 신호 메커니즘의 품질이 있습니다. 이 경우 신호는 컬렉션에서 항목을 사용할 수 있고 해당 신호와 관련된 데이터가 항목 자체임을 의미합니다.
이 튜토리얼에는 알아야 할 사항에 대한 자세한 설명이 있습니다.http://www.albahari.com/threading/
특히 이것은 xxxresetevent 클래스를 다룰 것입니다.
http://www.albahari.com/threading/part2.aspx
그리고 이것은 대기/펄스를 다룰 것입니다.http://www.albahari.com/threading/part4.aspx#_wait_and_pulse