2009-07-09 14 views
8

Mit einem pthread_cond_t wir einen Mutex zu assoziieren haben, wenn die Bedingung signalisiert I Anruf Pthread_cond_broadcast mit Mutex gehalten oder nicht?

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_cond_broadcast(&cond); 
pthread_mutex_unlock(&mutex); 

und

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_mutex_unlock(&mutex); 
pthread_cond_broadcast(&cond); 

gesehen Code wie

haben Welches ist der richtige Weg? (Ist es wichtig?)

Antwort

13

Hängt davon ab, was die Senken tun (und alle anderen Quellen).

In Ihrem zweiten Codebeispiel ist es möglich, dass zwischen dem Entsperren und dem Senden eine Menge anderer Threads kommen und einige Kombinationen von Dingen ausführen, die die Bedingung wieder falsch machen. Sie werden dann sinnlos senden. Und Sie werden nicht unbedingt die gleichen Kellner haben wie bei der Änderung der Bedingung, die sich auf Ihr Design auswirken kann oder auch nicht.

Ein vernünftiges Waschbecken sollte nicht kümmern, wenn es erwacht und der Zustand falsch ist, vor allem, wenn Sie Broadcast verwenden. Solange jede Änderung der Bedingung auf "wahr" schließlich von einer Übertragung gefolgt wird, bin ich mir ziemlich sicher, dass man mit entsprechend geschriebenen Senken eine Zustandsvariable willy-nilly mit oder ohne Sperre senden kann.

Also ich glaube nicht, dass es wirklich wichtig ist, aber persönlich würde ich mit der gehaltenen Sperre senden, um nur zu vermeiden, sich darum kümmern zu müssen. "Atomic change-and-signal" könnte das Zustandsdiagramm auf Ihrem Whiteboard im Vergleich zu "change ... einige Zeit später, signal" vereinfachen.

Beide sind richtig (im Gegensatz zum Warten ohne Mutex, was nicht erlaubt ist), aber ich denke nicht, dass es zu schwierig wäre, Anwendungen zu entwickeln, die im zweiten Fall schief gehen können, das würde nicht funktionieren gehe in der ersten falsch. Sie müssten wahrscheinlich einige Kellner dazu bringen, etwas Ungewöhnliches zu tun.

Die Spezifikation sagt eher kryptisch: "Wenn vorhersehbares Planungsverhalten erforderlich ist, dann sollte Mutex durch den Thread gesperrt werden, der pthread_cond_broadcast() oder pthread_cond_signal() aufruft."

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html

+0

, die die gleiche Frage, die ich Ihre Antwort gefunden haben. Ich bin Ihrem Link gefolgt und ich denke, dass er gebissen hat, dass Sie Zitat bezieht sich auf das frühere Bit: "Wenn mehr als ein Thread für eine Bedingungsvariable blockiert wird, bestimmt die Scheduling-Richtlinie die Reihenfolge, in der Threads entsperrt werden." – wilx

+0

@wilx: Ja, meine Sorge ist, was erlaubt ist "unvorhersehbare Planung Verhalten". Angenommen, Sie haben einen Scheduler, der dokumentiert ist oder über eine Option verfügt, dass Mutexe und Bedingungsvariablen den zu erweckenden Thread auf FIFO-Basis auswählen. Bedeutet der "kryptische" Satz, dass das Verhalten nicht als FIFO erwartet wird, wenn ein Aufrufer von 'pthread_cond_signal' nicht den Mutex hält? Ich denke schon, aber ich kenne die formale Definition von "vorhersehbar" nicht, deshalb finde ich es kryptisch. Außer in einem RT-System behandle ich die Planung immer etwas unberechenbar, aber ich möchte nicht, dass es bizarr wird. –

+0

Es ist kein Fall bekannt, bei dem es darauf ankommt, ob Ihre Sendung vor oder nach dem Entsperren gesendet wurde. Mit großer Schwierigkeit kann man Code erstellen, der bricht, wenn man nach einem Entsperren ein Signal anlegt. –