Informazioni sulla sincronizzazione

Per sincronizzare l'accesso a una risorsa, usare uno degli oggetti di sincronizzazione in una delle funzioni di attesa . Lo stato di un oggetto di sincronizzazione è segnalato o non segnalato. Le funzioni di attesa consentono a un thread di bloccare la propria esecuzione fino a quando un oggetto non segnalato specificato viene impostato nello stato di segnalazione. Per altre informazioni, vedere Sincronizzazione tra processi.

Scelta della primitiva di sincronizzazione corretta

Primitivo Scope Performance Rientrante Quando utilizzare
Blocco SRW (Slim Reader/Writer) Processo singolo Veloce (in genere in modalità utente; può passare alla modalità kernel in caso di contesa) No Scelta predefinita per i carichi di lavoro con carico di lettura nel codice moderno. Ingombro di memoria minimo (dimensioni di un puntatore).
Sezione critica Processo singolo Veloce (attesa attiva, poi attesa del kernel) Utilizzare quando è necessario un blocco rientrante/ricorsivo all'interno di un unico processo. Leggermente più grande di SRW.
Mutex Cross-process (denominato) Più lento (sempre oggetto kernel) Necessario per la sincronizzazione tra processi tramite un mutex denominato. Utile anche con WaitForMultipleObjects.
Semaforo Cross-process (denominato) Oggetto kernel N/A Limita l'accesso simultaneo a un pool di risorse (ad esempio, il pool di connessioni di N elementi).
Evento Cross-process (denominato) oggetto del kernel N/A Segnalazione tra thread/processi. Da usare per notifiche del tipo "è successo qualcosa", non per proteggere i dati.
C++ std::mutex / std::shared_mutex Processo singolo Definito dall'implementazione No Preferito per il codice C++ portatile e RAII. Usare quando non sono necessarie API di attesa Win32 o sincronizzazione tra processi.

Note

Blocchi SRW e sezioni critiche: per il nuovo codice che non richiede il blocco ricorsivo, preferisce i blocchi SRW (AcquireSRWLockExclusive/AcquireSRWLockShared). Sono più piccoli, più veloci e supportano la semantica lettore/scrittore. Le sezioni critiche restano appropriate quando è necessaria l'acquisizione rientrante (ricorsiva) da parte dello stesso thread.

Importante

Errore comune: l'uso di un mutex per la sincronizzazione all'interno del processo quando sarebbe sufficiente un blocco di sezione critica o SRW. I mutex implicano sempre una transizione in modalità kernel, rendendoli notevolmente più lenti per le operazioni ad alta frequenza all'interno di un singolo processo.

Di seguito sono riportati altri meccanismi di sincronizzazione:

Per altre informazioni sulla sincronizzazione, vedere Problemi di sincronizzazione e multiprocessore.