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.Wait
volontà 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.
fonte
2009-09-22 18:56:51
C'è un * lotto * di comportamento .NET che "dovrebbe essere documentato", ma non lo è, purtroppo. –