Cytując stronę podręcznika:
Podczas korzystania ze zmiennych warunkowych zawsze istnieje predykat boolowski obejmujący zmienne współdzielone skojarzone z każdym warunkiem oczekiwania, który jest prawdą, jeśli wątek powinien kontynuować. Mogą wystąpić fałszywe wybudzenia z funkcji pthread_cond_timedwait () lub pthread_cond_wait (). Ponieważ powrót z pthread_cond_timedwait () lub pthread_cond_wait () nie implikuje nic o wartości tego predykatu, predykat powinien zostać ponownie oceniony po takim powrocie.
Więc pthread_cond_wait
może wrócić, nawet jeśli tego nie zasygnalizowałeś. Przynajmniej na pierwszy rzut oka wydaje się to dość okropne. To byłoby jak funkcja, która losowo zwraca niewłaściwą wartość lub zwraca losowo, zanim faktycznie osiągnie właściwą instrukcję powrotu. Wygląda na poważny błąd. Ale fakt, że zdecydowali się udokumentować to na stronie podręcznika zamiast naprawiać, wydaje się wskazywać, że istnieje uzasadniony powód, dla którego pthread_cond_wait
budzą się fałszywie. Przypuszczalnie jest coś nieodłącznego w tym, jak to działa, co sprawia, że nie można temu zaradzić. Pytanie brzmi: co.
Dlaczego nie pthread_cond_wait
wrócić fałszywie? Dlaczego nie może zagwarantować, że obudzi się tylko wtedy, gdy zostanie odpowiednio zasygnalizowana? Czy ktoś może wyjaśnić powód jego fałszywego zachowania?
pthread_cond_(timed)wait
: „Jeśli sygnał jest dostarczany ... wątek wznawia oczekiwanie na zmienną warunku, tak jakby była nie zostanie przerwany lub zwróci zero z powodu fałszywego wybudzenia ”. Inne funkcje blokujące wskazują, EINTR
kiedy są przerywane przez sygnał (np. read
) Lub są wymagane do wznowienia (np pthread_mutex_lock
.). Więc gdyby nie było innych powodów fałszywego wybudzenia, pthread_cond_wait
można by je zdefiniować w ten sposób.