2015-09-12 24 views
5

Se si esamina la documentazione che descrive l'utilizzo di variabili di condizione (cv), si vedrà che ad es. in PThreads e C++ non è necessario mantenere il mutex di un cv per chiamare la notifica su questo cv. Mentre, ad es. in Java e Python, è necessario bloccare il mutex per fare la stessa cosa.Pattern di utilizzo delle variabili di condizione in C/C++ e in altre lingue

C'è qualche motivo profondo per cui le cose sono implementate in questo modo (sono circa l'ultimo caso), dato che un'implementazione di un linguaggio come Java alla fine utilizza alcuni strumenti di thread nativi?

+0

Probabilmente non è implementato solo su pthreads .. ma questa è solo un'ipotesi. Sento che questa domanda potrebbe migliorare (o anche * qualsiasi *) risposte su http://cs.stackexchange.com/ ... –

+0

Ovviamente la JVM potrebbe implementarlo in questo modo, ma fa un errore comune che ho visto molte, molte persone fanno in C++ molto meno probabilmente ad un costo ragionevolmente basso (è necessario tenere un blocco un po 'più lungo ma il gioco è fatto) – Voo

+0

@Voo L'errore è che il mutex non viene tenuto durante la modifica dei dati da cui dipende la condizione? – vehsakul

risposta

0

Gli strumenti di sincronizzazione di base Java notify e notifyAll richiedono entrambi di eseguire la sincronizzazione sull'oggetto prima di chiamarli. Questo è per un semplice punto di sicurezza poiché richiede anche la sincronizzazione su di essi prima di wait ing.

Ad esempio se si dispone di due thread. Un thread legge i dati da un buffer e un thread scrive i dati nel buffer.

Il thread di dati di lettura deve attendere che il thread di dati di scrittura abbia finito di scrivere un blocco di dati nel buffer e quindi possa leggere il blocco.

Se wait(), notify(), e notifyAll() metodi possono essere chiamati senza sincronizzazione allora si può ottenere una condizione di competizione in cui:

  • Il filo di lettura chiama wait() e il filo si aggiunge alla coda di attesa.

  • Allo stesso tempo, il thread di scrittura chiama notify() per segnalare che ha aggiunto dati.

  • Il thread di lettura manca la modifica e attende per sempre dal momento che il notify() è stato elaborato prima che fosse wait().

Forzando la wait e notify avvenire entro un blocco sincronizzato questa condizione di competizione è rimossa.