2012-03-19 15 views
6

Qual è la differenza tra InterlockedCompareExchangeRelease() e InterlockedCompareExchangeAcquire()?Qual è la differenza tra InterlockedCompareExchange Release() e Acquire()?

Quando provo ad imparare le funzioni di sincronizzazione con Win32 API, trovo ci sono due funzioni denominate in modo diverso, ma sembra fare la stessa cosa:

LONG __cdecl InterlockedCompareExchangeRelease(
    __inout LONG volatile *Destination, 
    __in  LONG Exchange, 
    __in  LONG Comparand 
); 

e

LONG __cdecl InterlockedCompareExchangeAcquire(
    __inout LONG volatile *Destination, 
    __in  LONG Exchange, 
    __in  LONG Comparand 
); 

I controllare la MSDN, dice che quelle funzioni sono:

Esegue un'operazione di confronto e di scambio atomico sul valore specificato valori. La funzione confronta due valori a 32 bit specificati e gli scambi con un altro valore a 32 bit in base all'esito del confronto .

ma per InterlockedCompareExchangeAcquire(),

L'operazione viene eseguita con la semantica di accesso alla memoria acquisire.

e per InterlockedCompareExchangeRelease(),

Lo scambio viene eseguita con la semantica di accesso alla memoria di rilascio.

Quindi sono curioso della differenza tra queste due funzioni. Quando utilizzare la semantica di accesso alla memoria o per la memoria di accesso alla memoria di rilascio ? Ci sono degli esempi?

Grazie!

risposta

1

ho trovato this e this su MSDN:

semantica memoria Acquisto specificano che l'operazione di memoria eseguita dal thread corrente saranno visibili prima di qualsiasi altra operazione di memoria sono tentate. Rilasciare la semantica della memoria specifica che l'operazione di memoria eseguita dal thread corrente sarà visibile dopo che tutte le altre operazioni di memoria sono state completate. Queste semantiche consentono di forzare le operazioni di memoria da eseguire in un ordine specifico. Usa la semantica acquisita quando entri in una regione protetta e rilasci la semantica quando la lasci.