2008-09-27 2 views
1

최근에 C#에서 EventWaitHandle의 강력한 동작에 대해 살펴본 결과 자매 응용 프로그램에서 일부 기능을 동일하게 수행하기로 결정했습니다. 유일한 문제는 자매 응용 프로그램이 C로 작성되었다는 것입니다.pthread_cond_t에 대한 EventWaitHandle 동작

큰 문제는 없지만 pthreads는 신호 허용 pthread_cond_t 데이터 유형을 사용하고 있습니다. 내 유일한 질문은 뭔가가 대기하기 전에 cond가 '신호로 표시'될 수 있습니까?

지금 내 테스트에서는 아니오라고 말합니다. 즉, ThreadB가 대기하기 전에 ThreadA가 신호를 보내면 ThreadB는 무한정 대기합니다. C#에서 EventWaitHandle의 기능에 더 가깝게 작동 할 수있는 또 다른 pthread 유형이 있습니까? 객체는 신호를받습니다. 즉, 기다리고있는 첫 번째 스레드가 즉시 전달되어 unsignalled로 설정됩니다.

다른 데이터 구조로 pthread_cond를 래핑하는 것이 너무 어렵지는 않습니다. 하지만이 기능은 이미 pthread 라이브러리에서 사용할 수 있습니까?

답변

4

조건 변수를 올바르게 사용하는 경우 문제가되지 않습니다.

코드의 기본 흐름은 (의사 코드에서)해야한다 :

lock(lockobj); 
while (!signalled) { 
    wait(condvar); 
} 
signalled = false; 
unlock(lockobj); 
대기 측

및 :

lock(lockobj); 
signalled = true; 
notify(condvar); 
unlock(lockobj); 

을 신호 측에. (물론, 사용되는 잠금 객체와 조건 변수는 양쪽에서 동일해야합니다.) 희망이 도움이됩니다!

+0

신호가 전송되기 전에 대기중인 스레드가 잠겨 있으면 교착 상태가 될 수 있습니다 ... 그렇지 않습니까? –

+0

아뇨, condvar에서 대기 중일 때 lockobj가 해제됩니다 (이것은 조건 변수가 작동하는 방식에 따라 자동 및 원자 적으로 수행됨). 그러나 대기중인 스레드가 다시 실행되기 전에 다시 획득됩니다. –

+0

뮤텍스 해제 동작에 대한 http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_wait.html을 참조하십시오. –

0

다중 신호 (예 : 두 번 신호로 보내면 상태가 다시 unsignall되기 전에 두 개의 스레드가 대기 할 수 있음)를 원할 경우 대체 코드 (의사 코드로도 가능).

대기 측 :

lock(lockobj); 
while (signalled != 0) { 
    wait(condvar); 
} 
--signalled; 
unlock(lockobj); 

시그널링 측면 :

lock(lockobj); 
++signalled; 
notify(condvar); 
unlock(lockobj); 
0

난 그냥 새로운 구조의 조건 유형을 포장 결국 훨씬 C의 #에서 EventWaitHandle처럼 행동하는 몇 가지 간단한 기능을 만들었습니다. 적절한 직렬화 된 액세스를 달성하려면 두 개의 뮤텍스가 필요했습니다.

cond_mutex는 조건부 변수에서 대기하는 데 사용되고 data_mutex는 상태를 신호에서 신호로 설정하지 않을 때 사용됩니다.

리셋 모드는 C#과 동일합니다. 자동 또는 수동. 이렇게하면 event_wait_t가 대기 후 자동으로 재설정됩니다. 또는 프로그래머가 수동으로 event_wait_reset (event_wait_t * ewh) 호출을 수행하도록 할 수도 있습니다.

+0

아니요, 1 뮤텍스로 충분합니다. 이것이 작동하는 이유에 대한 내 의견 (pthread_cond_wait의 뮤텍스 릴리스 동작에 대한 설명)을 참조하십시오. (event_wait_reset은 같은 뮤텍스를 사용할 수 있습니다.) –

관련 문제