Condividi tramite


Sincronizzazione dell'esecuzione di più thread

Per evitare race condition e deadlock, è necessario sincronizzare l'accesso da più thread alle risorse condivise. La sincronizzazione è necessaria anche per garantire che il codice interdipendent venga eseguito nella sequenza corretta.

Esistono diversi oggetti i cui handle possono essere usati per sincronizzare più thread. Questi oggetti includono:

  • Buffer di input della console
  • Eventi
  • Mutex
  • Processi
  • Semafori
  • Thread
  • Timer

Lo stato di ognuno di questi oggetti viene segnalato o non segnalato. Quando si specifica un handle per uno di questi oggetti in una chiamata a una delle funzioni di attesa, l'esecuzione del thread chiamante viene bloccata fino a quando lo stato dell'oggetto specificato non viene segnalato.

Alcuni di questi oggetti sono utili per bloccare un thread fino a quando non si verifica un evento. Ad esempio, un handle del buffer di input della console viene segnalato quando è presente un input non letto, ad esempio una sequenza di tasti o un clic del pulsante del mouse. Gli handle di processo e thread vengono indicati quando termina il processo o il thread. In questo modo un processo, ad esempio, può creare un processo figlio e quindi bloccare la propria esecuzione fino al termine del nuovo processo.

Altri oggetti sono utili per proteggere le risorse condivise dall'accesso simultaneo. Ad esempio, più thread possono avere un handle per un oggetto mutex. Prima di accedere a una risorsa condivisa, i thread devono chiamare una delle funzioni di attesa per attendere che venga segnalato lo stato del mutex. Quando il mutex viene segnalato, viene rilasciato un solo thread in attesa per accedere alla risorsa. Lo stato del mutex viene immediatamente reimpostato su non segnalato in modo che gli altri thread in attesa rimangano bloccati. Al termine del thread con la risorsa, deve impostare lo stato del mutex su segnalato per consentire ad altri thread di accedere alla risorsa.

Per i thread di un singolo processo, gli oggetti sezione critica forniscono un mezzo di sincronizzazione più efficiente rispetto ai mutex. Una sezione critica viene usata come un mutex per consentire a un thread alla volta di usare la risorsa protetta. Un thread può usare la funzione EnterCriticalSection per richiedere la proprietà di una sezione critica. Se è già di proprietà di un altro thread, il thread richiedente viene bloccato. Un thread può usare la funzione TryEnterCriticalSection per richiedere la proprietà di una sezione critica, senza bloccare il mancato recupero della sezione critica. Dopo aver ricevuto la proprietà, il thread è libero di usare la risorsa protetta. L'esecuzione degli altri thread del processo non è interessata a meno che non tentino di immettere la stessa sezione critica.

La funzione WaitForInputIdle fa attendere un thread finché non viene inizializzato un processo specificato e attende l'input dell'utente senza input in sospeso. La chiamata a WaitForInputIdle può essere utile per sincronizzare i processi padre e figlio, perché CreateProcess restituisce senza attendere il completamento dell'inizializzazione del processo figlio.

Per altre informazioni, vedere Sincronizzazione.