Атомарность загрузок и хранилищ на x86C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Атомарность загрузок и хранилищ на x86

Сообщение Anonymous »


8.1.2 Блокировка шины
Процессоры Intel 64 и IA-32 предоставляют сигнал LOCK#, который устанавливается
автоматически во время определенных критических операций с памятью для блокировки
системной шины или эквивалентного канала. Пока этот выходной сигнал активен,
запросы от других процессоров или агентов шины на управление шиной
блокируются. Программное обеспечение может указать другие случаи, когда семантика LOCK
должна следовать, добавляя префикс LOCK к
инструкции.

Это взято из Руководства Intel, том 3.
Похоже, что атомарные операции с памятью будут выполняться непосредственно в памяти (ОЗУ). Я в замешательстве, потому что не вижу «ничего особенного», когда анализирую выходные данные сборки.
По сути, выходные данные сборки, сгенерированные для std::atomic X; X.load() — это обычная загрузка mov. И если я правильно понимаю, X.store(2) — это просто mov [где-то], 2 плюс mfence, если это seq_cst. Но он отвечает за правильный порядок памяти, а не за атомарность. Вот и все. Кажется, что он не «пропускает» кеш.
Я знаю, что перемещение выровненных целых чисел, например целых чисел, в память является атомарным. Однако я в замешательстве.

Итак, я высказал свои сомнения, но главный вопрос:
Как процессор реализует атомарные операции внутри себя?

Подробнее здесь: https://stackoverflow.com/questions/384 ... res-on-x86
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»