Mi chiedevo: Locking consente solo 1 thread per entrare in una regione di codiceAutoResetEvent come sostituzione di un blocco in C#?
E aspettare maniglie è per la segnalazione::
segnalazione è quando uno thread attende finché non riceve notifica da un'altra.
Quindi ho pensato a me stesso, può essere utilizzato per sostituire una serratura?
qualcosa di simile:
Thread number 1 --please enter (autoreset --> autlock)
dowork...
finish work...
set signal to invite the next thread
Così ho scritto questo:
/*1*/ static EventWaitHandle _waitHandle = new AutoResetEvent(true);
/*2*/
/*3*/ volatile int i = 0;
/*4*/ void Main()
/*5*/ {
/*6*/
/*7*/ for (int k = 0; k < 10; k++)
/*8*/ {
/*9*/ var g = i;
/*10*/ Interlocked.Increment(ref i);
/*11*/ new Thread(() = > DoWork(g)).Start();
/*12*/
/*13*/ }
/*14*/
/*15*/ Console.ReadLine();
/*16*/ }
/*17*/
/*18*/
/*19*/ void DoWork(object o)
/*20*/ {
/*21*/ _waitHandle.WaitOne();
/*22*/ Thread.Sleep(10);
/*23*/ Console.WriteLine((int) o + "Working...");
/*24*/ _waitHandle.Set();
/*25*/
/*26*/ }
come si può vedere: le linee 21 #, # 24 è la sostituzione per il blocco.
Domanda:
- E 'un valido sostituto? (non che sostituirò
lock
, ma voglio sapere degli scenari di utilizzo) - Quando dovrei usarli?
Grazie.
strano ma così non contiene una domanda per quanto riguarda _lock vs EventWaitHandle_
SO ha una domanda simile: http://stackoverflow.com/questions/1717194/autoresetevent-manualresetevent-vs-monitor – empi
@empi heh, tutti i 3 termini sono nella composizione generale (monitor.enter vs lock, autoreset vs waithandle ....) ma sì è simile.tuttavia si noti che 'AutoResetEvent/waithdnales' sono ** non condivisi ** tra processi. lo scrittore ha confuso con Mutex. comunque lui ha torto. (a tale proposito). –
@empi anche la risposta più votata parla delle differenze quando c'è un comando set (meteo se thread è in attesa o no). –