2014-04-22 1 views
0

명령을 보내고 응답을받을 수있는 장치로 일부 통신을 설정하려고합니다. 그러나 나는 무한 대기 시간을 방지하기 위해 타임 아웃 플래그를 제어하고 싶다.EventWaitHandle - 복수 스레드 = 일관되지 않은 동작

내가 이런 짓을 :

스레드 :

private volatile EventWaitHandle _signal; 

public void Send() 
{ 
    // Do something 

    _signal.WaitOne(30000); 

    // Continue with something else 

    _signal.Reset(); 
} 

public void Receive() 
{ 
    _signal.Set(); 
} 

내 질문은 내가 여러 스레드가있는 경우 전송 방법 및 다음과 같은 시나리오를 액세스 할 수 있습니다 (의이 예를 들어 2를 가정 해 봅시다)이며, A :

// Sends a "listen" command, but no response is received 
Send(); 

스레드 B :

// Sends a "cancel" command and response (success) is received 
Send(); 
,

내가 이해할 수있는 두 번째 명령 (취소)에 대한 응답을받을 때 때때로 두 스레드가 계속 일치하지 않는 경우가 있습니다. 그러나 때로는 첫 번째 스레드가 30000ms 시간 초과에 도달 할 때가 있습니다.

제가 누락되거나 잘못하고있는 것에 대한 조언이 있습니까?

+0

'AutoResetEvent'를 사용하고 있지 않습니까? 'ManualResetEvent'를 사용해야합니다. 그렇지 않으면 대기중인 스레드가 신호를 받으면 자동으로 재설정됩니다. 실제로 대기 핸들을 전혀 사용하지 않으려 고합니다. NET 4.5.1을 사용할 여력이 있다면 특히 당신이하려는 일에 더 나은 해결책이 될 것입니다. 왜 이것이 멀티 스레드 방식입니까? – Luaan

+0

보류중인 응답, 즉 전송 된 명령을 취소하기 위해 ManualResetEvent 및 멀티 스레드를 사용하지만 응답을 받기 전에이를 취소 할 수 있어야합니다. (.Net 4.0으로 제한됨) – NubieJ

+1

.NET 4.0에서는 4.5를 사용하기 때문에 비동기 I/O를 사용할 수 있습니다. – Luaan

답변

3

EventWaitHandle은 여기에 적절한 동기화 개체가 아닙니다. mutual exclusion이 필요하므로 하나의 스레드가 명령을 보내고 응답을 기다리는 상태가 될 수 있습니다. 즉, 스레드는 엄격하게 장치와 통신하기 위해 방향을 전환해야합니다.

ManualResetEvent는 Set()을 호출하자 마자 모두 WaitOne() 호출에서 블로킹하는 스레드는 차단 해제됩니다. 이것이 둘 이상이면 두 개 이상의 스레드가 동시에 명령을 보내려고 할 때 프로그램이 오작동합니다.

Mutex는 MUTual Exclusion을 제공합니다. 그것이 그 이름을 얻는 방법입니다.

+0

이것은 의미가 있지만, 다른 스레드를 제외하면 차단중인 스레드에서 현재 요청을 취소하는 방법은 무엇입니까? – NubieJ

+0

당신은 당신의 질문에 무엇이 막혀 있을지 전혀 암시하지 않았습니다. 어떤 종류의 I/O 요청이 완료되기를 기다리고 있습니다. WaitAny()와 마찬가지로 취소 요청을 기다립니다. 그것은 추측입니다. 그런 다음 뮤텍스를 해제하십시오. –

관련 문제