wymagania dostosowania dla atomowych instrukcji x86
Microsoft oferujeInterlockedCompareExchange
funkcja do wykonywania atomowych operacji porównania i zamiany. Jest też_InterlockedCompareExchange
wewnętrzny.
Na x86 są one implementowane za pomocącmpxchg
instrukcja.
Jednakże, czytając dokumentację dotyczącą tych trzech podejść, wydaje się, że nie zgadzają się z wymaganiami dostosowania.
Intelinstrukcja obsługi nie mówi nic o wyrównaniu (poza tymJeśli sprawdzanie wyrównania jest włączone i tworzone jest nieprzypisane odwołanie do pamięci, generowany jest wyjątek)
Sprawdziłem równieżlock
prefiks, który wyraźnie to stwierdza
Integralność prefiksu LOCK tonie wpływ wyrównania pola pamięci.
(podkreślenie moje)
Tak więc Intel wydaje się twierdzić, że wyrównanie jest nieistotne. Operacja będzie atomowa bez względu na wszystko.
The_InterlockedCompareExchange
wewnętrzna dokumentacja również nie mówi nic o wyrównaniu, jednakInterlockedCompareExchange
funkcjonować stwierdza, że
Parametry tej funkcji muszą być wyrównane na granicy 32-bitowej; w przeciwnym razie funkcja będzie zachowywać się nieprzewidywalnie w wieloprocesorowych systemach x86 i systemach innych niż x86.
Więc co daje? Czy wymagania dotyczące wyrównania są dlaInterlockedCompareExchange
aby upewnić się, że funkcja będzie działać nawet na procesorach sprzed 486, gdziecmpxchg
instrukcja nie jest dostępna? To wydaje się prawdopodobne na podstawie powyższych informacji, ale chciałbym być pewien, zanim na tym polegam. :)
Albo czy dostosowanie wymagane przez ISA gwarantuje atomowość, a ja szukam niewłaściwych miejsc w podręcznikach Intela?