2009-03-07 2 views
6

이 수 :는 단일로 SetEvent() 트리거 다수의 WaitForSingleObject()는

http://msdn.microsoft.com/en-us/library/ms686915(VS.85).aspx

하지 제안 보인다.

세 가지 프로세스가 파이프를 통해 통신합니다. 프로세스 A 이벤트를 생성하고 프로세스 B & C는 각각 WaitForSingleObject를 사용합니다 (두 번째 스레드에서).

그래서 이제 우리는 -TWO- 각각이 -SINGLE 이벤트를 기다리고 있습니다.

프로세스 A는 SetEvent()로 이벤트를 시작하고 프로세스 B는 응답하며 프로세스 C는 이벤트를 시작하지 않습니다.

결론 :

각각의 WaitForSingleObject()가 독특한 이벤트가 필요합니다 ... 올바른?

답변

5

수동 재설정 이벤트를 사용하면 단일 이벤트에서 여러 스레드를 트리거 할 수 있습니다.

Here

당신은 현재 이벤트를 기다리는 모든 스레드를 해제하기 위해 수동 리셋 Evenets과 PulseEvent 기능을 사용할 수 있습니다 "수동 리셋 이벤트"플래그

+0

불행히도 프로세스 A를 제어 할 수 없으므로이를 구현할 수 없습니다. –

2

를 사용하는 예입니다.

그러나이 접근법은 "현재 대기중인 스레드 ..."라는 것을 알 수있는 방법이 없으므로 본질적으로 정확합니다. 웨이크 업/2 대기 이벤트가 정확히 일치해야하는 경우보다 안정적인 동기화 메커니즘을 사용해야합니다.

+0

이 문제에 대해서는 언급하지 않았지만 프로세스 A에 대한 제어권이 없습니다. 그러나 나중에 참조 할 수 있도록 PulseEvent 함수를 살펴 보겠습니다. 감사합니다. –

+0

B & C 스레드 만 변경할 수 있다면 A에서 모든 스레드를 깨우려고하는 대신 하나의 스레드를 다른 스레드에서 깨우는 것이 가장 좋습니다 (예 : A -> B -> C). 제어 A, 당신은 몇 가지 잠금/웨이크 업 프로토콜/인터페이스가 있어야하고, 질문에 언급. – jpalecek

+1

PulseEvent를 사용하지 마십시오. http://blogs.msdn.com/oldnewthing/archive/2005/01/05/346888.aspx – CesarB

0

나는이 예제 당신을 도울 수 있기를 바랍니다 :

handle1A = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME) 

handle1B = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME) 

handle2A = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME+GetCurrentThreadId()) 

handle2B = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME+GetCurrentThreadId()) 

A) 같은 NAME와 이벤트를 만들 경우, 모든 setEvent 모든 waitforsingleobjects

SetEvent(handle1A) // Send signaling to handle1A and handle1B 

B 신호) 당신이 이벤트를 만들 경우 고유 한 NAME 인 경우 setEvent은 참조 된 핸들에만 신호를 보냅니다.

SetEvent(handle2) // Send signling only to handle2A. The Id Thread is unique 
0

하나의 이벤트가 수동 재설정 이벤트 인 경우 여러 스레드에 알릴 수 있습니다. 자동 재설정 이벤트는 그렇게 할 수 없습니다. 두 개 이상의 트레드가 자동 재설정 이벤트를 위해 동시에 대기하고 신호 상태로 설정하면 하나의 스레드 만 존재하고 재설정되며 다른 스레드의 동작은 정의되지 않습니다. Microsoft 설명서에서 하나의 스레드 만 종료되지만 다른 스레드는 종료하지 않는 것으로 가정 할 수 있습니다. 어쨌든 다음과 같은 견적을 고려해야합니다. "선입 선출 (FIFO) 주문을 가정하지 마십시오. 커널 모드 APC와 같은 외부 이벤트로 대기 명령이 변경 될 수 있습니다. "소스 - https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs.85).aspx

CreateEvent 함수에는 bManualReset 매개 변수가 있습니다. TRUE이면이 함수는 수동 재설정 이벤트 객체를 만듭니다. ResetEvent 함수를 사용하여 이벤트 상태를 신호가 발생하지 않도록 설정해야합니다. 이 매개 변수가 FALSE 인 경우 함수는 자동 재설정 이벤트 객체를 만들고 시스템은 대기중인 단일 스레드가 해제 된 후 즉 WaitForMultipleObjects 또는 WaitForSigleObject와 같은 함수에서 빠져 나간 후 이벤트 상태를 신호가없는 것으로 자동 재설정합니다. 전에 쓴, 단 하나의 스레드가 모두 통보되지 않습니다.PulseEvent 약으로

- 그것은 신뢰할 수 있고 사용해서는 안됩니다 - 만의 thread가 현재 PulseEvent에서 "대기"상태에있는 PulseEvent에 의해 통보

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684914(v=vs.85).aspx가 호출을 참조하십시오. 다른 상태에있는 경우 알림을받지 않으므로 스레드 상태가 무엇인지 알 수 없습니다. 동기화 오브젝트에서 대기중인 스레드는 커널 모드 비동기 프로 시저 호출에 의해 대기 상태에서 일시적으로 제거 된 다음 APC 완료 후 대기 상태로 리턴 될 수 있습니다. 스레드가 대기 상태에서 제거 된 시간 동안 PulseEvent에 대한 호출이 발생하면 PulseEvent는 호출 된 순간 대기중인 스레드 만 해제하므로 스레드는 해제되지 않습니다. 당신은 자동에 대한 더 많은 아이디어를 얻을 수 있습니다

: 당신은 다음 링크에서 비동기 프로 시저 호출 커널 모드 (APC)에 대한 자세한 내용을 찾을 수 있습니다 재설정 이벤트 및 수동 재설정 이벤트는 다음 문서에서 제공됩니다.