Un uso di variabili di condizione che è un po 'più complicato di una semplice coda di messaggi, è di "condividere un blocco", dove thread differenti sono in attesa di condizioni sottilmente diverse della stessa natura di base. Ad esempio, hai una cache web (molto brillante, semplificata). Ogni voce nella cache ha tre possibili stati: non presente, IN_PROGRESS, COMPLETE.
getURL:
lock the cache
three cases for the key:
not present:
add it (IN_PROGRESS)
release the lock
fetch the URL
take the lock
update to COMPLETE and store the data
broadcast the condition variable
goto COMPLETE
COMPLETE:
release the lock and return the data
IN_PROGRESS:
while (still IN_PROGRESS):
wait on the condition variable
goto COMPLETE
ho in pratica utilizzato il modello di attuare una variante della funzione POSIX pthread_once
senza alcun aiuto dal programmatore. Il motivo per cui non ho potuto utilizzare un semaforo o un lucchetto per once_control
e solo eseguire l'inizializzazione sotto il blocco, è che la funzione non è stata lasciata fallire e il once_control
ha avuto solo un'inizializzazione banale. Del resto, lo stesso pthread_once
non ha codici di errore definiti, quindi implementarlo per riuscire a fallire non lascia il tuo chiamante con buone opzioni ...
Naturalmente con questo modello devi stare attento al ridimensionamento. Ogni volta che viene completata un'inizializzazione, ogni thread di attesa si attiva per afferrare il blocco. Quindi, quando si progetta il sistema, si pensa molto attentamente alla condivisione e quindi si decide di non essere disturbati a fare nulla per implementarlo realmente finché non si vedono problemi di prestazioni comprovati.
fonte
2010-03-19 11:32:15
Questo dovrebbe essere wiki della comunità? – jasonline
Poiché non si sta cercando una risposta specifica e solo "risposte" più generali, probabilmente. Ma io sono più sul recinto di questo, potresti voler aspettare il no o il yay dagli altri. – GManNickG
+1 Prendi questi punti reputazione ben meritati mentre puoi per questa bella domanda :-) –