2009-07-09 6 views
8

Con un pthread_cond_t dobbiamo associare un mutex, quando segnalando la condizione che ho visto comechiama pthread_cond_broadcast con mutex tenuto o no? Codice

pthread_mutex_lock(&mutex); 

//code that makes condition true 

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

e

pthread_mutex_lock(&mutex); 

//code that makes condition true 

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

Qual è il modo corretto? (È importante?)

risposta

13

Dipende da cosa stanno facendo i sink (e da qualsiasi altra fonte).

Nel tuo secondo esempio di codice, è possibile che tra lo sblocco e la trasmissione, un mucchio di altri thread arriverà e farà una combinazione di cose che rende nuovamente false le condizioni. Quindi trasmetteresti inutilmente. E non avrai necessariamente lo stesso gruppo di camerieri che erano lì quando hai cambiato la condizione, il che potrebbe o meno influenzare il tuo design.

Un lavandino decente non dovrebbe importare se viene svegliato e la condizione è falsa, specialmente se si sta utilizzando la trasmissione. Finché ogni cambiamento di condizione a "vero" è infine seguito da una trasmissione, sono abbastanza sicuro che con i sink appropriatamente scritti, puoi trasmettere una variabile di condizione willy-nilly con o senza il lock.

Quindi non penso che importi davvero, ma personalmente trasmetterei con il lucchetto, anche solo per evitare di dovermi preoccupare. "Atomic change-and-signal" potrebbe semplificare il diagramma di stato sulla lavagna rispetto a "modifica ... qualche tempo dopo, segnale".

Entrambe sono corrette (diversamente dall'attesa senza il mutex, che non è consentito), ma non penso sarebbe troppo difficile trovare degli usi che possono andare male nel secondo caso, che non sbagliare nel primo Probabilmente dovevano coinvolgere alcuni camerieri che facevano cose un po 'insolite, comunque.

La specifica dice cripticamente "se è richiesto un comportamento di pianificazione prevedibile, allora quel mutex deve essere bloccato dal thread che chiama pthread_cond_broadcast() o pthread_cond_signal()."

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

+0

Avendo la stessa domanda che ho trovato la tua risposta. Ho seguito il tuo link e penso che il bit che hai citato sia correlato al bit precedente: "Se più di un thread è bloccato su una variabile di condizione, il criterio di pianificazione determina l'ordine in cui i thread sono sbloccati." – wilx

+0

@wilx: sì, la mia preoccupazione è ciò che è permesso da "comportamento di programmazione imprevedibile". Ad esempio, si supponga di disporre di uno scheduler documentato o di un'opzione che le variabili mutex e condition scelgano il thread da attivare su base FIFO. La frase "criptica" implica che il comportamento non dovrebbe essere FIFO se un chiamante di 'pthread_cond_signal' non regge il mutex? Lo penserei, ma non conosco la definizione formale di "prevedibile", ecco perché la trovo criptica. Tranne che in un sistema RT, considero sempre la programmazione un po 'imprevedibile, ma non voglio che diventi bizzarra. –

+0

Non è noto alcun caso in cui è importante se la trasmissione è stata effettuata prima o dopo lo sblocco. Con grande difficoltà, si può costruire un codice che si rompe se si sposta un segnale dopo uno sblocco. –