Accesso a variabili interlocked

Le applicazioni devono sincronizzare l'accesso alle variabili condivise da più thread. Le applicazioni devono anche garantire che le operazioni su queste variabili vengano eseguite in modo atomico (eseguite interamente o non affatto).

Le letture e le scritture semplici in variabili a 32 bit allineate correttamente sono operazioni atomiche. In altre parole, non si finirà con una sola parte della variabile aggiornata; tutti i bit vengono aggiornati in modo atomico. Tuttavia, non è garantito che l'accesso venga sincronizzato. Se due thread stanno leggendo e scrivendo dalla stessa variabile, non è possibile determinare se un thread eseguirà l'operazione di lettura prima che l'altra esegua l'operazione di scrittura.

Le letture e le scritture semplici in variabili a 64 bit allineate correttamente sono atomiche in Windows a 64 bit. Le letture e le scritture in valori a 64 bit non sono necessariamente atomiche in Windows a 32 bit. Le letture e le scritture in variabili di altre dimensioni non sono necessariamente atomiche in alcuna piattaforma.

The Interlocked API

Le funzioni interlocked forniscono un meccanismo semplice per sincronizzare l'accesso a una variabile condivisa da più thread. Eseguono anche operazioni sulle variabili in modo atomico. I thread di processi diversi possono usare queste funzioni se la variabile è in memoria condivisa.

Le funzioni InterlockedIncrement e InterlockedDecrement combinano i passaggi necessari per incrementare o decrementare una variabile in un'operazione atomica. Questa funzionalità è utile in un sistema operativo multitasking, in cui il sistema può interrompere l'esecuzione di un thread per concedere una sezione di tempo del processore a un altro thread. Senza tale sincronizzazione, due thread potrebbero leggere lo stesso valore, incrementarlo di 1 e archiviare il nuovo valore per un aumento totale di 1 anziché 2. Le funzioni di accesso a variabili interlock proteggono da questo tipo di errore.

Le funzioni InterlockedExchange e InterlockedExchangePointer scambiano atomicamente i valori delle variabili specificate. La funzione InterlockedExchangeAdd combina due operazioni: l'aggiunta di due variabili e l'archiviazione del risultato in una delle variabili.

Le funzioni InterlockedCompareExchange, InterlockedCompare64Exchange128 e InterlockedCompareExchangePointer combinano due operazioni: confronto di due valori e archiviazione di un terzo valore in una delle variabili, in base al risultato del confronto.

Le funzioni InterlockedAnd, InterlockedOr e InterlockedXor eseguono rispettivamente operazioni AND, OR e XOR.

Esistono funzioni progettate specificamente per eseguire l'accesso a variabili interlock su valori e indirizzi di memoria a 64 bit e sono ottimizzate per l'uso in Windows a 64 bit. Ognuna di queste funzioni contiene "64" nel nome; Ad esempio, InterlockedDecrement64 e InterlockedCompareExchangeAcquire64.

La maggior parte delle funzioni interlocked offre barriere di memoria complete in tutte le piattaforme Windows. Esistono anche funzioni che combinano le operazioni di base di accesso a variabili interlock con la semantica di acquisizione e rilascio dell'ordinamento della memoria supportata da determinati processori. Ognuna di queste funzioni contiene la parola "Acquire" o "Release" nei nomi; Ad esempio, InterlockedDecrementAcquire e InterlockedDecrementRelease. Acquisire la semantica di memoria specifica che l'operazione di memoria eseguita dal thread corrente sarà visibile prima che vengano tentate altre operazioni di memoria. La semantica della memoria di rilascio specifica che l'operazione di memoria eseguita dal thread corrente sarà visibile dopo il completamento di tutte le altre operazioni di memoria. Questa semantica consente di forzare l'esecuzione delle operazioni di memoria in un ordine specifico. Usare la semantica di acquisizione quando si immette un'area protetta e si rilascia la semantica quando viene lasciata.

Intrinseci del compilatore

Problemi di sincronizzazione e multiprocessore