2009-09-22 8 views

risposta

64

Joe Duffy's "Concurrent Programming On Windows" menziona questo (P311-312, P598). Questo bit è interessante:

Si noti che in tutti gli esempi di cui sopra, le discussioni devono essere resistenti a qualcosa chiamato spurio wake-up - codice che utilizza variabili di condizione dovrebbero rimanere corretta e vivace anche nei casi in cui è svegliato prematuramente , cioè, prima che la condizione ricercata sia stata stabilita. Ciò non dipende dal fatto che l'implementazione eseguirà effettivamente tali operazioni (sebbene alcune implementazioni su altre piattaforme come Java e Pthreads siano note per farlo), né perché il codice riattiverà i thread intenzionalmente quando non è necessario, ma piuttosto perché non c'è garantire intorno a quando un thread che è stato risvegliato sarà programmato. Le variabili di condizione non sono corrette. È possibile - e anche probabile - che un altro thread acquisisca il blocco associato e renda falsa la condizione prima che il thread risvegliato abbia la possibilità di riacquisire il blocco e tornare alla regione critica.

Quindi fornisce il modello normale per un ciclo while che verifica la condizione.

direi che da questo è ragionevole aspettarsi che Monitor.Waitvolontà non normalmente ti svegli prematuramente, e che se proprio sa che nient'altro può essere cambiata la condizione allora si potrebbe essere in grado di andare via senza il ciclo delle condizioni: ma è più sicuro includerlo comunque, nel caso in cui la tua logica non sia accurata.

+0

Ottima spiegazione dei risvegli spuri. Grazie! – Gili

+0

Sto controllando direttamente con Joe per vedere se la mia estrapolazione è corretta. –

+0

Joe ti ha contattato? A pagina 207 dello stesso libro, afferma che CLR utilizza una routine di attesa comune (alertable) ogni volta che si blocca, incluso il blocco delle chiamate a Monitor. Questo implicherebbe che oltre alle "apparenti" scie spurie di cui parli, la tua attesa potrebbe anche essere soggetta ad un risveglio "genuino" causato da una chiamata di procedura asincrona? –