In applicazioni con un alto numero di utenti come quelle web si ha sempre il rischio di avere più accessi contemporanei alla stessa risorsa.
Questo può non essere un problema se il tipo di risorsa è un database o uno qualsiasi che supporti l'accesso contemporaneo da parte di più thread, ma in molti casi si deve ricorrere a file esterni o altri dispositivi che non supportano accessi multipli.
Per ovviare a questo poblema abbiamo bisogno di gestire una coda di accessi alla stessa risorsa e in questo il .NET Framework ci viene in aiuto, fornendoci una classe denominata Mutex presente nel namespace System.Threading.
Lo scopo di questa classe è di garantire l'accesso esclusivo alla risorsa condivisa di un singolo thread per volta.
I metodi chiave per questa classe sono WaitOne() e ReleaseMutex(), che come fanno intendere i nomi, servono rispettivamente a mettere il attesa il codice finchè la risorsa non è stata rilasciata e comunicare alla successiva in coda che l'operazione del thread corrente in quel metodo è conclusa.
Lo snippet seguente mostra un casistica tipica di accesso contemporaneo:
private static Mutex myMutex = new Mutex(); for(int i = 0; i < 10; i++) { Thread myThread = new Thread(new ThreadStart(WriteFile)); myThread.Name = "Thread_"+ (i + 1).ToString(); myThread.Start(); } private static void WriteFile() { try { // Metto in coda attesa le risorse seguenti myMutex.WaitOne(); Console.WriteLine("Inizio utilizzo risorsa da parte di : {0}", Thread.CurrentThread.Name); // Simulo una pausa che potrebbe essere un'operazione su un file. Thread.Sleep(500); Console.WriteLine("Fine utilizzo della risorsa da parte di {0}", Thread.CurrentThread.Name); } catch {} finally { // Rilascio le risorse sul file e do via libera al prossimo elemento in coda myMutex.ReleaseMutex(); } }
A differenza del Monitor (System.Threading.Monitor), il Mutex permette la sincronizzazione di più thread appartenenti a processi differenti e per far ciò è necessario impostare il nome del Mutex tramite un overload del costruttore.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Da oggi è possibile sviluppare per Windows Phone 7 anche in Visual Basic
- Disponibile la ROM e l'SDK di Windows Phone 7.1 beta 2
- Rilasciata una preview di Windows Phone SDK 7.1.1 per Tango
- Le novità di Azure da TechEd 2013 North America: fatturazione per minuto, BizTalk Services e nuovi benefit per abbonati MSDN
- ASP.NET Website Programming
- Blazor: from 0 to SPA
- Visual Studio Code e ASP.NET 5 su Windows, Linux e MacOSX
- Visual Studio, Open Source, Cloud e Web
- Le novità di Visual Studio 2013 Update 2 e le opportunità per gli sviluppatori