조건과 신호를 변경하는 코드 경로에서 뮤텍스를 잠그지 않으면 wakeup이 손실 될 수 있습니다. 다음 프로세스 쌍을 고려하십시오.
프로세스 A :
pthread_mutex_lock(&mutex);
while (condition == FALSE)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
프로세스 B (잘못된) :
condition = TRUE;
pthread_cond_signal(&cond);
그런 다음 다음 condition
과 같이 시작하는 명령어 인터리빙 가능성을 고려하십시오 FALSE
.
Process A Process B
pthread_mutex_lock(&mutex);
while (condition == FALSE)
condition = TRUE;
pthread_cond_signal(&cond);
pthread_cond_wait(&cond, &mutex);
은 condition
지금 TRUE
하지만, 프로세스 A는 조건 변수에 붙어 대기 - 그것은 웨이크 업 신호를 놓쳤다. 프로세스 B를 변경하여 뮤텍스를 잠그면 :
프로세스 B (정확함) :
pthread_mutex_lock(&mutex);
condition = TRUE;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
... 위의 상황이 발생할 수 없습니다. 웨이크 업을 놓치지 않습니다.
( 실제로 자체를. 뒤에 이동할 수 있지만 이로 인해 스레드의 최적 스케줄링이 떨어질 수 있으며 조건 자체를 변경하기 때문에이 코드 경로에 이미 뮤텍스를 잠근 것입니다).pthread_cond_signal()
pthread_mutex_unlock()
pthread_signal_cond()
수 있습니다. 을 호출하는 지점에서pthread_signal_cond()
조건 자체를 수정하기 위해 이미 뮤텍스를 잠 가야 한다고 말하는 것이 더 정확할 것입니다.