Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
pthread_cond_broadcast
Mal ne Frage an die Leute vom Legrstuhl/Tutoren, wenn mal ne Pause von der korrektur noetig ist.
Wieso haben wir in den Uebungen folgende Variante:
pthread_mutex_lock(&m);
//stuff
pthread_cond_broadcast(&c);
pthread_mutex_unlock(&m);
verwendet, anstatt:
pthread_mutex_lock(&m);
//stuff
pthread_mutex_unlock(&m);
pthread_cond_broadcast(&c);
Was sind die Unterschiede/Probleme beider Varianten?
Bzw. konkrekt zur ersten Variante: Was passiert, wenn der der Thread nach broadcast verdraengt wird, alle wartenden Threads aufgeweckt werden, drankommen und feststellen, dass der Mutex noch gelockt ist? Kann dabei kein lost wakeup auftreten?
Stell’s dir vor wie bei Mesa:
Die Threads wachen nach dem Broadcast erst dann auf, wenn der Mutex freigegeben ist, broadcast schickt die nur in die Eintrittswarteschlange. Daher gibt’s kein Lost Wakeup, wenn der Thread verdrängt wird, dann steht alles. (Das einzige was “festgestellt” wird, wenn der Thread “drankommt”, ist in der while-Schleife, und das ist i<=0.)
Die zweite Variante dürfte die selbe Funktionalität haben.
Die selbe Funktionalität ja (also beides funktioniert und ist korrekt), aber ggf. anderes Verhalten.
Im zweiten Fall kann zwischen dem [m]pthread_mutex_unlock(3)[/m] und dem [m]pthread_cond_broadcast(3)[/m] ein anderer Thread (der nicht schon wartet) ein “[m]P()[/m]” machen, im ersten Fall haben die Threads die schon warten, eine besser Chance zuerst das “[m]P()[/m]” zu machen, weil sie gleichzeitig um das Lock konkurieren.