Как атомарно прочитать значение в x86 ASM? - PullRequest
5 голосов
/ 28 июля 2010

Я знаю, как атомарно записать значение в x86 ASM.Но как мне прочитать один?Префикс LOCK нельзя использовать с mov.

Чтобы увеличить значение, я делаю:

lock inc dword ptr Counter

Как прочитать счетчик в поточно-безопасном режиме?

Ответы [ 4 ]

5 голосов
/ 28 июля 2010

Как я вам объясню в этом посте:

Доступ к кэш-памяти, которые разделить по ширине шины, строки кэша, и границы страницы не гарантируются быть на атомном уровне Intel Core 2 Duo, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, семейство P6, Pentium и Процессоры Intel486. Intel Core 2 Duo, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon и семейство P6 процессоры обеспечивают сигналы управления шиной которые разрешают подсистемы внешней памяти сделать разделенный доступ атомарным; однако доступ к данным без выравнивания будет серьезно повлиять на производительность процессор и его следует избегать.

Так что используйте:

LOCK        CMPXCHG   EAX, [J]

LOCK CMPXCHG сначала ограничивает кэш-память, а затем сравнивает EAX со значением назначения, если значение назначения не равно, тогда результат в EAX является значением назначения.

EDIT: ССЫЛКИ на:

Руководства разработчика программного обеспечения для архитектур Intel® 64 и IA-32

В Том 3А: Руководство по системному программированию см. Раздел 8.1.1

Также проверьте: Раздел Справочного руководства по оптимизации: ГЛАВА 7 ИСПОЛЬЗОВАНИЕ КАТАЛА ОПТИМИЗАЦИИ

4 голосов
/ 28 июля 2010

Я не эксперт по сборке, но чтение / запись размером в слова (для x86, 32-разрядных) уже должно быть атомарным.

Причина, по которой вам нужно заблокировать приращение, заключается в том, чточитать и писать.

1 голос
/ 28 июля 2010

Интересно прочитать другие ответы.Я думаю, что @GJ, вероятно, на деньги.

В течение многих лет всегда было верно, что 32-битное чтение и запись были атомарными.Только в последние годы с действительно агрессивным кэшированием это уже не гарантируется.

Наверное, поэтому я предпочитаю C ++, Java или что-то подобное между мной и машинным кодом.В наши дни машинный код слишком сложен для надежной записи (если вы не сделаете это много , чтобы сохранить свои навыки острыми).К счастью, современные оптимизирующие компиляторы настолько хороши, что вам редко требуется производительность оптимизированного вручную ассемблера.

1 голос
/ 28 июля 2010

Для простого чтения речь идет в основном о выравнивании.Самый простой способ обеспечить атомарное чтение - это всегда использовать «естественное» выравнивание, т. Е. Выравнивание не меньше размера элемента (например, 32-разрядный элемент является 32-разрядным выравниванием).

Выровненные чтения не обязательно являются атомарными.В качестве крайнего примера рассмотрим считывание 32-разрядного значения по нечетному адресу, где первый байт находится в одной строке кэша, а остальные три байта находятся в другой строке кэша.В таком случае атомарное чтение по существу невозможно.

Поскольку (по крайней мере, большинство) процессоров используют шину памяти шириной 64 бита, самый большой элемент, который можно надеяться на атомарное чтение, - 64 бита.*

...