Multithreading: quando utilizzare le classi di sincronizzazione
Le classi multithread disponibili in MFC possono essere suddivise in due categorie: gli oggetti di sincronizzazione (CSyncObject, CSemaphore, CMutex, CCriticalSection e CEvent) e gli oggetti di accesso alla sincronizzazione (CMultiLock e CSingleLock).
Le classi di sincronizzazione sono utilizzate quando è necessario controllare l'accesso a una risorsa per assicurarne l'integrità.Le classi di accesso alla sincronizzazione vengono utilizzate per accedere a tali risorse controllate.In questo argomento vengono descritte le situazioni in cui utilizzare ogni classe.
Per determinare la classe di sincronizzazione da utilizzare, è necessario stabilire quanto segue.
Se prima di poter accedere alla risorsa è necessario attendere che si verifichi un evento, ad esempio se è necessario che i dati vengano ricevuti da una porta di comunicazione prima di poter essere scritti in un file.
In caso affermativo, utilizzare CEvent.
Se è possibile l'accesso contemporaneo alla risorsa da parte di più thread all'interno della stessa applicazione, ad esempio, se nell'applicazione sono consentite fino a cinque finestre con visualizzazioni dello stesso documento.
In caso affermativo, utilizzare CSemaphore.
Se è possibile che la risorsa sia utilizzata da più applicazioni, ad esempio se la risorsa è una DLL.
In caso affermativo, utilizzare CMutex.
In caso negativo, utilizzare CCriticalSection.
CSyncObject non viene mai utilizzata direttamentee rappresenta la classe base per le altre quattro classi di sincronizzazione.
Esempio 1: utilizzo di tre classi di sincronizzazione
Si consideri ad esempio un'applicazione che consente di gestire un elenco collegato di account.L'applicazione consente di esaminare fino a tre account all'interno di finestre distinte, ma è possibile aggiornare solo un account alla volta.Quando un account viene aggiornato, i dati aggiornati vengono inviati in rete a un archivio di dati.
Nell'applicazione di esempio vengono utilizzati tutti e tre i tipi di classi di sincronizzazione.Poiché è possibile esaminare contemporaneamente fino a tre account, viene utilizzata CSemaphore per limitare l'accesso ai tre oggetti.Quando si tenta di visualizzare un quarto account, viene attesa la chiusura di una delle tre finestre oppure viene restituito un errore.Quando un account viene aggiornato, viene utilizzata CCriticalSectionper garantire che venga aggiornato un solo account per volta.L'aggiornamento, una volta terminato, viene segnalato a CEvent, che rilascia un thread in attesa della segnalazione dell'evento.Con questo thread, i nuovi dati vengono inviati all'archivio dati.
Esempio 2: utilizzo delle classi di accesso alla sincronizzazione
La scelta della classe di accesso alla sincronizzazione da utilizzare è ancora più semplice.Se nell'applicazione viene eseguito l'accesso a un'unica risorsa controllata, utilizzare CSingleLock.Se è richiesto l'accesso a una risorsa all'interno di un gruppo di risorse controllate, utilizzare CMultiLock.Nell'esempio 1 precedente, sarebbe stata utilizzata CSingleLock, come in ogni caso in cui sia necessaria una sola risorsa alla volta.
Per informazioni sull'utilizzo delle classi di sincronizzazione, vedere Multithreading: utilizzo delle classi di sincronizzazione.Per informazioni sulla sincronizzazione, vedere Synchronization in Windows SDK.Per informazioni sul supporto delle operazioni multithread in MFC, vedere Multithreading con C++ e MFC.