Partager via


Sémantique d’acquisition et de publication

Une opération a acquis la sémantique si d’autres processeurs voient toujours son effet avant l’effet de toute opération suivante. Une opération a une sémantique de libération si d’autres processeurs voient l’effet de chaque opération précédente avant l’effet de l’opération elle-même.

Considérez l’exemple de code suivant :

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

Du point de vue d’un autre processeur, les opérations précédentes peuvent sembler se produire dans n’importe quel ordre. Par exemple, l’autre processeur peut voir l’incrément de b avant l’incrément de a.

Les opérations atomiques, telles que celles effectuées par les routines Xxx verrouillées, ont la sémantique d’acquisition et de libération par défaut. Toutefois, les processeurs Itanium exécutent des opérations qui n’ont que l’acquisition ou la libération de la sémantique plus rapidement que celles qui ont les deux. Par conséquent, le système fournit des versions InterlockedXxxAcquire et Interlocked XxxRelease de certaines des routines Interlocked Xxx.

Par exemple, la routine InterlockedIncrementAcquire utilise la sémantique d’acquisition pour incrémenter une variable. Si vous réécritez l’exemple de code précédent comme suit :

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

les autres processeurs verraient toujours l’incrément de a avant les incréments de b et c.

De même, la routine InterlockedIncrementRelease utilise la sémantique de libération pour incrémenter une variable. Si vous réécritez à nouveau l’exemple de code, comme suit :

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

les autres processeurs verraient toujours les incréments de a et b avant l’incrément de c.

Si le processeur ne fournit pas d’instructions qui ont uniquement la sémantique d’acquisition ou de mise en production, le système utilise la routine correspondante qui fournit les deux types de sémantique. Par exemple, sur les processeurs x86 , InterlockedIncrementAcquire et InterlockedIncrementRelease sont équivalents à InterlockedIncrement.

Le tableau suivant répertorie les routines qui ont des variantes acquire-only et release-only.

RoutineXxx verrouillée Acquérir une version sémantique uniquement Version de la sémantique de mise en production uniquement

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease