Microsoft offre la funzione InterlockedCompareExchange
per l'esecuzione di operazioni di confronto e scambio atomiche. C'è anche un _InterlockedCompareExchange
intrinseco.requisiti di allineamento per le istruzioni atomiche x86
Su x86 questi sono implementati utilizzando l'istruzione cmpxchg
.
Tuttavia, leggendo la documentazione su questi tre approcci, non sembrano concordare i requisiti di allineamento.
Intel reference manual non dice nulla circa l'allineamento (diverso da quello di controllo se allineamento è attivata e un riferimento di memoria non allineato è fatto, viene generata un'eccezione)
Ho anche guardato il prefisso lock
, in cui si afferma espressamente che
l'integrità del prefisso serratura è non influenzata dall'allineamento del campo di memoria.
(sottolineatura mia)
Così Intel sembra dire che l'allineamento è irrilevante. L'operazione sarà atomica, non importa quale.
La documentazione intrinseca _InterlockedCompareExchange
dice anche nulla di allineamento, tuttavia la funzione InterlockedCompareExchange
afferma che
I parametri per questa funzione devono essere allineati su un limite di 32 bit; in caso contrario, la funzione si comporterà in modo imprevedibile sui sistemi x86 multiprocessore e su tutti i sistemi non x86.
Quindi cosa dà? I requisiti di allineamento per InterlockedCompareExchange
servono solo per assicurarsi che la funzione funzioni anche su CPU pre-486 in cui l'istruzione cmpxchg
non è disponibile? Sembra probabile sulla base delle informazioni di cui sopra, ma mi piacerebbe essere sicuro prima di fare affidamento su di esso. :)
Oppure l'allineamento richiesto dall'ISA per garantire l'atomicità, e sto solo cercando i posti sbagliati nei manuali di riferimento di Intel?
Il testo che cito sopra è tratto dai manuali Intel e indica chiaramente i diversi requisiti di allineamento per famiglia di processori. Probabilmente avrei dovuto usare una formulazione diversa per esprimere che le informazioni aggiornate di Intel sono molto chiare, immagino ciò che ottieni leggendo un file .pdf del 1999. – damageboy
-1: Hai ottenuto la sezione sbagliata dal manuale giusto. Le operazioni di memoria di base e le operazioni atomiche bloccate sono cose diverse. –
@damageboy -1: come giustamente osserva MackieMesser, la tua citazione parla di * operazioni di memoria di base * e non * operazioni atomiche *, cioè operazioni precedute da un 'LOCK', che era ciò che l'OP chiedeva, dato che' LOCK' è ciò che è usato in caso di operazioni atomiche x86. –