2012-06-12 15 views
7

Monitor.Enter e Monitor.Exit sono progettati per essere richiamati dallo stesso thread. Ma cosa succede se ho bisogno di rilasciare un lucchetto in un thread diverso da quello acquisito?Monitor.Enter e Monitor.Exit in diversi thread

Ad esempio: esistono risorse condivise e operazioni asincrone che utilizzano questa risorsa. L'operazione inizia con BeginOperation e acquisisce il blocco sulla risorsa condivisa. C'è anche il metodo EndOperation che rilascia il blocco. EndOperation viene in genere chiamato in un altro thread da un callback, pertanto non è possibile chiamare Monitor.Exit nel metodo EndOperation. Qual è l'approccio migliore in questo caso? Il doppio controllo del blocco con AutoResetEvent anziché Monitor può essere una buona soluzione?

+4

usare un "semaforo"? –

+0

@ pst Perché in particolare "Semaforo" e non "Evento"? – eigenein

+0

Vedere primitive di sincronizzazione come [Semaforo, SemaforoSlim, ReaderWriterLock, ReaderWriterLockSlim, ManualResetEvent, ManualResetEventSlim, AutoResetEvent, CountdownEvent, Interlocked, Mutex ecc.] (Http://msdn.microsoft.com/en-us/library/system.threading.aspx) –

risposta

7

Se è possibile utilizzare .NET 4.0, è possibile sostituirlo con System.Threading.Semaphore che consente di acquisire i permessi in un thread e di rilasciarli in un altro.

La classe Semaphore non applica l'identità del thread nelle chiamate a WaitOne o Release.

11

Il primitivo che stai cercando si chiama semaphore che può essere inserito in modo sicuro su un thread e uscito da un altro.

Problemi correlati