Spurious wakup jest dozwolone przez różne platformy. Aby przeciwdziałać tym, piszemy poniżej mechanizmu zapętlenie:W jaki sposób condition_variable :: wait_for() radzi sobie z fałszywymi wybudzeniami?
while(ContinueWaiting())
cv.wait(lock); // cv is a `std::conditional_variable` object
samo jest zrozumiałe dla conditional_variable::wait_until()
.
Ale spójrz na poniższy przykład:
const auto duration = Returns_10_seconds();
while(!Predicate())
cv.wait_for(lock, duration);
Wyobraźmy sobie, że nieprawdziwy budzenia się na 1 sekundę. Przekroczono limit czasu.
Czy będzie czekać jeszcze 10 sekund? Doprowadziłoby to do nieskończonej pętli, której jestem pewien, że nie powinno się zdarzyć. Z kodu źródłowego wewnętrznie wait_for()
dzwoni wait_until()
.
Chcę zrozumieć, w jaki sposób wait_for()
radzi sobie z fałszywymi wybudzeniami?
Nie. Musisz albo sprawdzić to samemu, albo użyć przeciążenia, które robi to za ciebie (ten, który bierze predykat). –
@MaiLongdong, predykat jest używany do przeciwdziałania tylko takim przebudzeniom. Nawet 'wait_for()' jeśli działa dobrze na mojej platformie, nie gwarantuje, że będzie działać wszędzie, ponieważ zbędne wakesupy są zależne od platformy. – iammilind
Jeśli nie chcesz 'wait_for' 10 sekund użyj' wait_until' 'now()' + 10 sekund :-) –