내 C++ 프로그램에서 pthread (Linux에서 실행)를 기반으로하는 트리거 및 대기 멤버 함수로 CEvent 클래스가 있습니다. 대기중인 프로세스가 하나있는 경우 구현이 매우 명확합니다 (예 : 온라인의 많은 사례). 그러나 이제는 여러 스레드가 이벤트를 기다리고 있고 trigger()가 호출 될 때 모두 깨어 있어야한다는 요구 사항을 만족해야합니다. 두 번째 조건으로 trigger()가 호출 될 때 대기중인 스레드 만 깨어 있어야합니다.대기 스레드를 깨우는 pthread 기반 이벤트
내 현재 코드 :
void CEvent::trigger() {
pthread_mutex_lock(&mutex);
wakeUp = true;
pthread_cond_broadcast(&condition)
pthread_mutex_unlock(&mutex);
wakeUp = false;
}
void CEvent::wait() {
pthread_mutex_lock(&mutex);
while (!wakeUp)
pthread_cond_wait(&condition, &mutex)
pthread_mutex_unlock(&mutex);
}
이 거의 한, 나는 다시 false로 모닝콜을 설정하기 전에 모든 스레드가 웨이크 업 대기로 작동하는 것 같다. 그러나 wakeUp 브로드 캐스트와 리셋 사이에 wait()를 호출하는 다른 (또는 같은) 쓰레드도 즉시 깨어 나면 받아 들일 수 없습니다. mutext 잠금 해제 전에 wakeUp = false로 설정하면 스레드가 깨어나지 않습니다.
내 질문 : * pthread_cond_broadcast는 언제 반환됩니까? 나는. 모든 스레드가 깨어나거나 이전에 돌아올 수있을 때만 반환된다는 보장이 있습니까? *이 문제에 대한 권장 해결책이 있습니까?
감사합니다.이 트릭을 수행하는 것 같습니다. –