Concetti legati ai thread 1. Sincronizzazione dei thread ManualResetEvent Il metodo Set() imposta lo stato su Signaled Reset() per impostarlo su nessun segnale WaitOne() bloccherà finché non avrà segnale, e se c'è un segnale al momento della chiamata di WaitOne, non bloccherà AutoResetEvent La differenza rispetto a ManualResetEvent è che AutoResetEvent.WaitOne() cambia automaticamente lo stato dell'oggetto evento, cioè lo stato dell'evento cambia ogni volta che AutoResetEvent.WaitOne() viene eseguito. Segnale - > nessun segnale; Nessun segnale – > ha segnale
example:
myResetEven.Set(), che in realtà è equivalente a uno switch, se il metodo set() non viene eseguito, il seguente waitOne() non potrà aspettare la notifica per permetterlo di eseguire, così che l'istruzione dopo waitOne non verrà eseguita. Metodo del monitor Il meccanismo Wait() Pulse() viene utilizzato per l'interazione interthread, quando un oggetto emette Monitor.Wait(), il thread che accede all'oggetto rimane in stato di attesa. Finché non riceve un segnale di risveglio. Monitor.Pulse() viene utilizzato per inviare segnali al thread in attesa. Cioè, nell'area critica tra Monitor.Enter() e Monitor.Exit(), per liberare il blocco sull'oggetto e bloccare il thread corrente, si trova in uno stato di attesa nella coda.
La serratura è diversa da quella di Mutex Sincronizzazione dei lock tra più thread Sincronizzazione di più thread tra processi Mutex, o sincronizzazione di più processi Nella programmazione multithread .Net, le classi AutoResetEvent e ManualResetEvent sono spesso usate, e il loro utilizzo è molto simile, ma ci sono differenze. Il metodo Set mette il segnale nello stato di invio, il metodo Reset mette il segnale nello stato non inviato, e WaitOne aspetta che il segnale venga inviato. Lo stato iniziale del costruttore può essere determinato dal valore del parametro; se è vero, non è bloccante, e falso è lo stato di blocco. Se un thread chiama il metodo WaitOne, il thread riceve il segnale quando è nello stato di send e continua a eseguire verso il basso. La differenza è che dopo la chiamata, AutoResetEvent.WaitOne() permette di entrare solo un thread alla volta, e quando un thread riceve un segnale, AutoResetEvent metterà automaticamente il segnale in stato di nessun invio, e gli altri thread che chiamano WaitOne possono solo continuare ad aspettare. Cioè, AutoResetEvent risveglia solo un thread alla volta; ManualResetEvent può risvegliare più thread, perché quando un thread chiama il metodo ManualResetEvent.Set(), gli altri thread che chiamano WaitOne ricevono il segnale per continuare l'esecuzione, e il ManualResetEvent non imposta automaticamente il segnale per non essere inviato. In altre parole, a meno che il metodo ManualResetEvent.Reset() non venga chiamato manually, il ManualResetEvent rimarrà segnalato e il ManualResetEvent può attivare più thread contemporaneamente per continuare l'esecuzione. |