Микропроцессоры отключают прерывания во время выполнения команд сравнения и обмена? - PullRequest
1 голос
/ 01 февраля 2020

Блокирует ли процессор Intel Core i5 (64 бит) с тактовой частотой 1,4 ГГц прерывания, когда выполняет команду сравнения и замены ?

Другими словами, если у меня есть std::atomic<int> atom_int;, значит ли это, что в течение atom_int++; сигналы (SIGINT, SIGSTP, SIGKILL) не могут быть доставлены процессу?

Я понимаю его вопрос о спецификациях процессора c и надеялся получить ответ для любого конкретного c процессора.

Ответы [ 2 ]

4 голосов
/ 01 февраля 2020

Следующие две вещи не обязательно совпадают:

  1. Atomi c операции на уровне C ++ (std :: atomi c)
  2. Инструкции процессора ассемблера, которые гарантированно будут атомы c

Например, современный процессор Intel гарантирует, что для 64-битных операций чтения / записи на 64-битный выровненный адрес будет атоми c. Это также гарантирует, что инструкция с префиксом LOCK выполняется атомарно.

В C ++, с другой стороны, std::atomic гарантирует, что операция над объектом выполняется атомарно. Хороший компилятор будет использовать для этого инструкции по одному процессору Atomi c, если это возможно. Однако для более крупных объектов эта атомарность не может быть достигнута одной инструкцией CPU atomi c. Следовательно, атомарность может быть гарантирована только при использовании более сложных методов синхронизации, таких как блокировки . Такие сложные методы синхронизации требуют нескольких инструкций ЦП и поэтому всегда могут быть прерваны.

Вы можете определить, использует ли std:atomic блокировки или нет, вызвав std::atomic::is_lock_free().

3 голосов
/ 01 февраля 2020

Процессоры Intel (эффективно) отключают прерывания во время выполнения ВСЕХ команд - прерывания могут доставляться только между инструкциями. Теперь выполнение инструкции может перекрываться во времени (путая то, что подразумевается под между ), но, как работает механизм прерывания, каждая инструкция до прерывания будет завершена, в то время как каждая инструкция после прерывания будет отменена ( не имеют никакого эффекта).

Обратите внимание, что только потому, что прерывание не может быть доставлено в середине инструкции, это не делает инструкцию atomi c, если инструкция содержит более один доступ к памяти (например, inc mem, который эффективно выполняет чтение-изменение-запись), поскольку другие процессоры или другие устройства, подключенные к шине, могут изменять расположение между ними. Для этого и нужен префикс lock - он гарантирует, что с этой ячейкой памяти больше ничего не случится во время выполнения инструкции.

...