Condividi tramite


Acquisire e rilasciare semantica

Un'operazione ha acquisito semantica se altri processori visualizzeranno sempre l'effetto prima dell'effetto dell'operazione successiva. Un'operazione ha una semantica di rilascio se altri processori vedranno l'effetto di ogni operazione precedente prima dell'effetto dell'operazione stessa.

Osservare l'esempio di codice seguente:

 a++;
 b++;
 c++;

Dal punto di vista di un altro processore, le operazioni precedenti possono apparire in qualsiasi ordine. Ad esempio, l'altro processore potrebbe visualizzare l'incremento di b prima dell'incremento di a.

Le operazioni atomiche, ad esempio quelle eseguite dalle routine Xxx interlocked, dispongono di semantiche di acquisizione e rilascio per impostazione predefinita. Tuttavia, i processori basati su Itanium eseguono operazioni che dispongono solo di semantiche di acquisizione o rilascio più veloci rispetto a quelle con entrambe. Di conseguenza, il sistema fornisce versioni xxx di acquisizione interlockedxxx e interlockedxxx di alcune delle routine Xxx interlocked.

Ad esempio, la routine InterlockedIncrementAcquire usa la semantica per incrementare una variabile. Se si riscrive l'esempio di codice precedente come indicato di seguito:

 InterlockedIncrementAcquire(&a);
 b++;
 c++;

altri processori vedranno sempre l'incremento di prima degli a incrementi di b e c.

Analogamente, la routine InterlockedIncrementRelease usa la semantica di rilascio per incrementare una variabile. Se si riscrive nuovamente l'esempio di codice, come segue:

 a++;
 b++;
 InterlockedIncrementRelease(&c);

altri processori vedranno sempre gli incrementi di a e b prima dell'incremento di c.

Se il processore non fornisce istruzioni che dispongono solo di semantiche di acquisizione o rilascio, il sistema userà la routine corrispondente che fornisce entrambi i tipi di semantica. Ad esempio, nei processori x86 sia InterlockedIncrementAcquire che InterlockedIncrementRelease sono equivalenti a InterlockedIncrement.

Nella tabella seguente sono elencate le routine che dispongono di varianti di sola acquisizione e di rilascio.

RoutineXxx interlocked Versione di sola semantica di Acquisizione Versione di sola semantica di versione

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease