Warum brauchen Sie eine while-Schleife, während Sie auf eine Zustandsvariable warten?

8

Sagen Sie, Sie haben diesen Code

%Vor%

Meine Frage ist, warum brauchen Sie hier eine While-Schleife? Würde pthread_cond_wait nicht einfach warten, bis der Signalisierungsthread cam_video_cond signalisiert? OK, ich weiß, dass Sie möglicherweise einen Fall haben, in dem cam- & gt; status nicht WAIT_DISPAY ist, wenn pthread_cond_wait aufgerufen wird, aber in diesem Fall Sie können es einfach durch eine Bedingung if überprüfen, anstatt while zu verwenden.

Fehle ich hier etwas? Mein Verständnis von pthread_cond_wait ist, dass es nur auf unendlich wartet, wenn cam_video_cond nicht signalisiert wird. Darüber hinaus wird der cam_video_lock Mutex beim Aufruf entsperrt, aber wenn die Bedingung signalisiert wird, wird vor der Rückkehr cam_video_lock zurückgesendet. Habe ich Recht?

    
MetallicPriest 14.10.2011, 10:03
quelle

3 Antworten

17
  

Es wird empfohlen, dass alle Threads den Zustand nach der Rückgabe prüfen   von pthread_cond_wait , da die Bedingung mehrere Gründe hat   könnte nicht wahr sein. Einer dieser Gründe ist ein ungewolltes Aufwecken; das ist,   ein Thread wird möglicherweise aufgeweckt, obwohl kein Thread das signalisiert hat   Bedingung.

Quelle: Spurious wakeup

    
Prince John Wesley 14.10.2011, 10:23
quelle
9

Störende Wakeups sind ein Grund, aber legitime, aber fremde Wakeups sind eine andere.

Überlegen Sie:

  1. Sie haben einen Job in eine Warteschlange gestellt.

  2. Sie signalisieren die Zustandsvariable Waking Thread A.

  3. Sie haben einen Job in eine Warteschlange gestellt.

  4. Sie signalisieren die Zustandsvariable Waking Thread B.

  5. Thread A wird geplant, macht den ersten Job.

  6. Thread A findet die Warteschlange nicht leer und erledigt den zweiten Job.

  7. Thread B wird eingeplant, nachdem er geweckt wurde, findet aber die Warteschlange noch leer.

David Schwartz 26.10.2011 22:43
quelle
2

Aus Leistungsgründen ermöglicht es die POSIX-API dem Betriebssystem, den Thread zu aktivieren, auch wenn die Bedingung nicht erfüllt ist (dies wird als bezeichnet Spurious Wakeup ).

    
phihag 14.10.2011 10:22
quelle

Tags und Links