Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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) | Sì | 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) | Sì | 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:
- di input e output sovrapposti
- chiamate di procedure asincrone
- oggetti di sezione critica
- variabili di condizione
- blocchi di lettura/scrittura sottili
- l'inizializzazione monouso
- l'accesso a variabili interbloccate
- liste collegate singolarmente interbloccate
- code timer
- La macro MemoryBarrier
Per altre informazioni sulla sincronizzazione, vedere Problemi di sincronizzazione e multiprocessore.