모니터 대신 autoresetevent 및 manualresetevent는 언제 사용합니까? wait ()/monitor.pulse ()?

StackOverflow https://stackoverflow.com/questions/158133

문제

둘 다 같은 목적을 달성하는 것 같습니다. 언제 다른 하나를 선택했을까요?

도움이 되었습니까?

해결책

무언가를하기 위해 여러 이벤트 중 하나 또는 모든 이벤트 중 하나를 기다리는 스레드가있을 때 이벤트를 사용하십시오.

액세스 할 수있는 스레드 수를 제한하여 데이터 구조에 대한 액세스를 제한하려면 모니터를 사용하십시오.

모니터는 일반적으로 자원을 보호하는 반면, 이벤트는 응용 프로그램 종료와 같은 일이 일어나고 있다고 말합니다.

또한 이벤트의 이름을 지정할 수 있으며 (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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top