IA-32 | проблема переупорядочения в многопроцессорной среде - PullRequest
1 голос
/ 04 февраля 2011

Я хочу выполнить атомарную 'и' операцию на IA-32.

Пожалуйста, рассмотрите следующую ситуацию:

; processor 0
lea     edx, var
mov  ecx, mask
mov  eax, [edx]
lock and [edx], ecx

; processor 1
lea     edx, var
mov  eax, 0xff
xchg [edx], eax

Я не уверен, возможно ли, что сохранение в 'var' процессором 1 может или не может происходить между загрузкой и сохранением в 'var' процессором 0. Итак, это работает, или мне нужно закрутить блокировку так:

; processor 0
push ebx
lea  edx, var
mov  ecx, mask
@@loop:
mov  ebx, [edx]
mov  eax, ebx
and  eax, ecx
lock cmpxchg [edx], eax
cmp  eax, ebx
jne  @@loop
pop  ebx

Спасибо за любой ответ. С наилучшими пожеланиями.

EDIT: Другими словами: Я хочу выполнить соединение в «Процессор 0» и мне нужно получить начальное значение.

1 Ответ

0 голосов
/ 04 февраля 2011

xchg, который ссылается на память, автоматически блокирует шину (или блокирует кэш, когда / если данные уже находятся в кэше). См. Справочное руководство Intel , §8.3.1. (Предупреждение: в последнее время я не слишком усердно выглядел, но Intel обычно реорганизовывала их веб-сайт, довольно быстро аннулируя ссылки. Если это так, поиск в Google, похожий на «intel reference 3a», должен его включить).

...