문제

나는 최근 C#에서 EventwaithAndle의 강력한 행동의 빛을 보았고 자매 응용 프로그램에서 일부 기능을 동일한 작업을 수행하기로 결정했습니다. 유일한 문제는 자매 앱이 C로 작성된다는 것입니다.

큰 문제는 없습니다. PTHREADS를 사용하고 있습니다. PTHREAD_COND_T DATATYPE가있는 PTHREADS를 사용하고 있습니다. 내 유일한 질문은, 무언가가 기다리기 전에 조건이 '신호'될 수 있습니까?

지금 내 테스트는 아니오라고 말합니다. 즉, Threadb가 대기하기 전에 Threada가 신호를 발사하면 Threadb는 무기한 기다립니다. C#의 EventwaithAndle의 기능에 더 가깝게 동작 할 수있는 또 다른 pthread 유형이 있습니까? 객체가 신호를받습니다. 즉, 첫 번째 스레드가 기다릴 첫 번째 스레드가 즉시 전달되어 서명되지 않은 상태로 설정합니다.

pthread_cond를 다른 데이터 구조로 래핑한다고해서이를 달성하기에는 너무 어렵지 않습니다. 그러나이 기능은 이미 PTHREAD 라이브러리에서 사용할 수 있습니까?

도움이 되었습니까?

해결책

조건 변수를 올바르게 사용하는 경우 중요하지 않습니다.

코드의 기본 흐름은 (의사 코드에서)이어야합니다.

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

대기쪽에 :

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

신호 측면에서. (물론, 잠금 객체와 조건 변수는 양쪽에서 동일해야합니다.) 이것이 도움이되기를 바랍니다!

다른 팁

대체 답변 (Pseudocode)을 원한다면 다중 서명 (즉, 두 번 신호를 보내면 상태가 다시 언급되기 전에 두 개의 스레드가 기다릴 수 있습니다).

대기 측 :

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

신호 측면 :

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

나는 새로운 구조로 조건 유형을 감싸고 c#의 eventwaithandle과 매우 흡사하기 위해 간단한 기능을 만들었습니다. 적절한 직렬화 된 액세스를 달성하기 위해 두 개의 뮤 테스가 필요했습니다.

cond_mutex는 조건부 변수를 대기하는 데 사용되는 반면, 데이터를 신호를 신호로 설정할 때 Data_Mutex가 사용됩니다.

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

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