Condividi tramite


Multithreading: quando usare le classi di sincronizzazione MFC

Le classi multithreading fornite con MFC rientrano in due categorie: oggetti di sincronizzazione (CSyncObject, CSemaphore, CMutex, CCriticalSection e CEvent) e oggetti di accesso alla sincronizzazione (CMultiLock e CSingleLock).

Le classi di sincronizzazione vengono usate quando l'accesso a una risorsa deve essere controllato per garantire l'integrità della risorsa. Le classi di accesso alla sincronizzazione vengono usate per ottenere l'accesso a queste risorse controllate. In questo argomento viene descritto quando usare ogni classe.

Per determinare la classe di sincronizzazione da usare, porre le seguenti serie di domande:

  1. L'applicazione deve attendere che si verifichi qualcosa prima che possa accedere alla risorsa ( ad esempio, i dati devono essere ricevuti da una porta di comunicazione prima che possano essere scritti in un file)?

    In caso affermativo, usare CEvent.

  2. È possibile accedere contemporaneamente a più thread all'interno della stessa applicazione ( ad esempio, l'applicazione consente fino a cinque finestre con visualizzazioni nello stesso documento)?

    In caso affermativo, usare CSemaphore.

  3. È possibile usare più di un'applicazione per questa risorsa( ad esempio, la risorsa si trova in una DLL)?

    In caso affermativo, usare CMutex.

    Se no, usare CCriticalSection.

CSyncObject non viene mai usato direttamente. È la classe di base per le altre quattro classi di sincronizzazione.

Esempio 1: Uso di tre classi di sincronizzazione

Ad esempio, prendere un'applicazione che gestisce un elenco collegato di account. Questa applicazione consente di esaminare fino a tre account in finestre separate, ma solo uno può essere aggiornato in qualsiasi momento specifico. Quando un account viene aggiornato, i dati aggiornati vengono inviati in rete a un archivio dati.

Questa applicazione di esempio usa tutti e tre i tipi di classi di sincronizzazione. Poiché consente di esaminare contemporaneamente fino a tre account, viene usato CSemaphore per limitare l'accesso a tre oggetti di visualizzazione. Quando si verifica un tentativo di visualizzare un quarto account, l'applicazione attende fino a quando una delle prime tre finestre si chiude o non riesce. Quando un account viene aggiornato, l'applicazione usa CCriticalSection per assicurarsi che venga aggiornato un solo account alla volta. Al termine dell'aggiornamento, segnala CEvent, che rilascia un thread in attesa della segnalazione dell'evento. Questo thread invia i nuovi dati all'archivio dati.

Esempio 2: Uso delle classi di accesso alla sincronizzazione

La scelta della classe di accesso alla sincronizzazione da usare è ancora più semplice. Se l'applicazione riguarda l'accesso a una singola risorsa controllata, usare CSingleLock. Se è necessario accedere a una qualsiasi delle risorse controllate, usare CMultiLock. Nell'esempio 1, CSingleLock sarebbe stato usato, perché in ogni caso è necessaria una sola risorsa in un determinato momento.

Per informazioni sull'uso delle classi di sincronizzazione, vedere Multithreading: Come usare le classi di sincronizzazione. Per informazioni sulla sincronizzazione, vedere Sincronizzazione in Windows SDK. Per informazioni sul supporto del multithreading in MFC, vedere Multithreading con C++ e MFC.

Vedi anche

Multithreading con C++ e MFC