Возможно ли на процессоре Intel x86 сравнивать одно значение с другим в определенной ячейке памяти, сбрасывая память, если сравнение прошло успешно, не беспокоясь о проблемах многопоточности/процессора? Вижу инструкцию CMPXCHG - подойдет? Или есть что-то для варианта использования сравнения и установки?
Сборка Intel x86 для сравнения и сброса памяти
Ответы (1)
Инструкция CMPXCHG сравнивает значение в подразумеваемом регистре (EAX) с адресатом и обновляет нулевой флаг (EFLAGS.ZF), чтобы указать, соответствует ли значение в адресате значению, указанному в EAX, и в этом случае значение в исходном операнде ( явный регистр) хранится в месте назначения. CMPXCHG также обновляет EAX значением, считанным из пункта назначения.
Википедия описывает compare-and-set
как вариант compare-and-swap
, где вы получаете истинное/ложное указание на то, соответствуют ли данные в ячейке памяти заданному значению и, следовательно, была ли обновлена ячейка памяти. Альтернатива compare-and-swap
возвращает содержимое, считанное из памяти, и вы можете самостоятельно сравнить его с заданным значением.
http://en.wikipedia.org/wiki/Compare-and-set
... перенаправляет на
http://en.wikipedia.org/wiki/Compare-and-swap
В этом смысле CMPXCHG является одновременно compare-and-set
и compare-and-swap.
.
Вы должны использовать префикс LOCK
, чтобы гарантировать атомарное выполнение CMPXCHG, то есть поток, выполняющий CMPXCHG, получает возможность прочитать, а затем записать ячейку памяти до того, как любой другой поток получит к ней доступ.
Вы говорите resetting the memory if the compare succeeded
, если вы имеете в виду установку ячейки памяти на ноль, тогда ноль - это значение, которое вы хотите в исходном регистре.
Для портативных способов выполнения compare-and-swap
см. ресурсы в этот вопрос SO
Обратите внимание, что инструкция CMPXCHG позволяет операнду назначения быть как регистром, так и ячейкой памяти. При тестировании 8 байтов вы должны использовать инструкцию CMPXCHG8B. В процессоре Pentium есть ошибка, когда вы указываете префикс LOCK
в инструкции CMPXCHG8B и указываете регистр в качестве места назначения, вы можете прочитать об этом подробнее здесь