Esempio di tecnologia della sincronizzazione Reader-Writer
Aggiornamento: novembre 2007
In questo esempio viene illustrato come utilizzare la classe ReaderWriterLock per la sincronizzazione dei thread. La funzionalità della classe ReaderWriterLock consente allo sviluppatore di scrivere codice che impone l'accesso esclusivo a una risorsa condivisa mentre un thread sta eseguendo un'operazione di scrittura o di modifica sulla risorsa, consentendo tuttavia l'accesso non esclusivo durante l'esecuzione di query o di operazioni di lettura sulla risorsa.
Per ulteriori informazioni sull'utilizzo degli esempi, vedere i seguenti argomenti:
Per compilare l'esempio utilizzando il prompt dei comandi
Aprire una finestra del prompt dei comandi, quindi spostarsi in una delle sottodirectory specifiche del linguaggio relative all'esempio.
Dalla riga di comando digitare msbuild ReaderWriterSynchronizationCS.sln o msbuild ReaderWriterSynchronizationVB.sln, a seconda del linguaggio di programmazione che si desidera utilizzare.
Per compilare l'esempio utilizzando Visual Studio
Aprire Esplora risorse, quindi spostarsi in una delle sottodirectory specifiche del linguaggio relative all'esempio.
Fare doppio clic sull'icona relativa a ReaderWriterSynchronizationCS.sln o ReaderWriterSynchronizationVB.sln, a seconda del linguaggio di programmazione che si desidera utilizzare, per aprire il file in Visual Studio.
Scegliere Compila soluzione dal menu Compila.
Per eseguire l'esempio
Spostarsi nella directory contenente il nuovo file eseguibile.
Digitare ReaderWriter.exe dalla riga di comando.
Nota: L'esempio compila un'applicazione console. Per visualizzare l'output dell'applicazione, è necessario avviarla dalla finestra del prompt dei comandi. Durante l'esecuzione dell'esempio è possibile notare che, per ciascun writer, l'output dell'opzione Fine scrittura viene visualizzato subito dopo l'output dell'opzione Inizio scrittura. Questo si verifica perché i writer, a differenza dei reader, mantengono l'accesso esclusivo alla risorsa.
Osservazioni
Per ulteriori informazioni sulla sincronizzazione dei thread e sull'accesso esclusivo, vedere i commenti nei file di codice sorgente e build.proj.
Nell'elenco riportato di seguito vengono descritte in modo sintetico le classi e le tecnologie utilizzate dall'esempio.
- Sincronizzazione di thread
ReaderWriterLock- Consente di proteggere una risorsa logica implementata come una chiamata a Sleep. I thread che utilizzano il tipo ReaderWriterLock possono mantenere il blocco in due modi diversi. Ad esempio, un thread può mantenere un blocco di lettura. Si tratta di un blocco non esclusivo, che consente ad altri thread di acquisire un blocco di lettura per la classe. In alternativa, un thread può richiedere un blocco di scrittura. Si tratta di un blocco esclusivo, che non viene concesso finché non vengono rilasciati i blocchi di lettura e scrittura attualmente mantenuti.
AutoResetEventIl thread principale dell'esempio rimane in attesa su un oggetto AutoResetEvent finché non viene impostato, ossia fino a quando l'ultima delle funzioni asincrone non completa le operazioni previste.
InterlockedNell'esempio vengono utilizzati i metodi statici Interlocked.Increment e Interlocked.Decrement per accedere in modo asincrono a una variabile contatore allo scopo di indicare quando l'oggetto AutoResetEvent deve essere impostato.
Threading
- ThreadPool - Durante la scrittura di codice gestito si consiglia agli sviluppatori di utilizzare, se possibile, il metodo QueueUserWorkItem per implementare le chiamate asincrone ai metodi. Nell'esempio viene utilizzato questo approccio per l'esecuzione di codice che tenta di acquisire la proprietà di una risorsa logica.
Delegati
- WaitCallback - Consente di creare un metodo di callback indipendente dai tipi per la classe ThreadPool da utilizzare.