Concepte legate de fire 1. Sincronizarea firelor de execuție ManualResetEvent Metoda Set() setează starea la Signaled Reset() pentru a-l seta la zero semnal WaitOne() va bloca până când are semnal, iar dacă există semnal în momentul apelării WaitOne, nu va bloca AutoResetEvent Diferența față de ManualResetEvent este că AutoResetEvent.WaitOne() schimbă automat starea obiectului eveniment, adică starea evenimentului se schimbă de fiecare dată când AutoResetEvent.WaitOne() este executat. Semnal - > fără semnal; Fără semnal – > are semnal
example:
myResetEven.Set(), care este de fapt echivalent cu un switch, dacă metoda set() nu este executată, următorul waitOne() nu va putea aștepta notificarea pentru a o lăsa să se execute, astfel încât instrucțiunea de după waitOne să nu fie executată. Metoda monitorului Mecanismul Wait() Pulse() este folosit pentru interacțiunea între fire, când un obiect emite Monitor.Wait(), firul care accesează obiectul rămâne în stare de așteptare. Până primește un semnal de trezire. Monitor.Pulse() este folosit pentru a trimite semnale către firul de așteptare. Adică, în zona critică dintre Monitor.Enter() și Monitor.Exit(), pentru a elibera blocarea obiectului și a bloca firul curent, acesta este în stare de așteptare în coadă.
Lock-ul este diferit de Mutex Sincronizarea blocărilor între mai multe fire de execuție Sincronizarea mai multor fire între procese Mutex sau sincronizarea mai multor procese În programarea multithread .Net, clasele AutoResetEvent și ManualResetEvent sunt adesea folosite, iar utilizarea lor este foarte similară, dar există diferențe. Metoda Set pune semnalul în starea de trimitere, metoda Reset pune semnalul în starea non-trimitere, iar WaitOne așteaptă ca semnalul să fie trimis. Starea inițială a constructorului poate fi determinată de valoarea parametrului; dacă este adevărată, nu blochează, iar fals este starea de blocare. Dacă un fir apelează metoda WaitOne, acesta primește semnalul când este în starea de trimitere și continuă să execute în jos. Diferența este că după apel, AutoResetEvent.WaitOne() permite intrarea unui singur fir simultan, iar când un fir primește un semnal, AutoResetEvent va pune automat semnalul în stare fără trimitere, iar celelalte fire care apelează WaitOne pot doar să continue să aștepte. Adică, AutoResetEvent trezește doar un fir de discuție odată; ManualResetEvent poate trezi mai multe fire, deoarece atunci când un fir apelează metoda ManualResetEvent.Set(), celelalte fire care apelează WaitOne primesc semnalul pentru a continua execuția, iar ManualResetEvent nu setează automat semnalul să nu fie trimis. Cu alte cuvinte, dacă metoda ManualResetEvent.Reset() nu este numită manual, ManualResetEvent va rămâne semnalizat, iar ManualResetEvent poate trezi mai multe fire simultan pentru a continua execuția. |