Насколько я понимаю, это специальные инструкции по сборке, которые гарантируют, что два процессора в системе SMP не могут записывать в одну и ту же область памяти одновременно. Например, в PowerP C приращение atomi c будет выглядеть примерно так:
retry:
lwarx r4, 0, r3 // Read integer from RAM location r3 into r4, placing reservation.
addi r4, r4, 1 // Add 1 to r4.
stwcx. r4, 0, r3 // Attempt to store incremented value back to RAM.
bne- retry // If the store failed (unlikely), retry.
Однако это не защищает четыре инструкции от начала, вытесненного прерыванием, и другой запланированной задачи. для защиты от вытеснения вам необходимо выполнить блокировку прерывания перед вводом кода.
Судя по тому, что я вижу для C ++ Atomics , они, похоже, при необходимости применяют блокировки. Итак, мой первый вопрос -
- Гарантирует ли стандарт C ++ отсутствие вытеснения во время операции atomi c? Если да, то где в стандарте это найти?
Я проверил atomic<int>::is_always_lock_free
на своем Intel P C, и он получил true
. С моим предположением о вышеупомянутом сборочном блоке это меня смутило. Покопавшись в сборке Intel (с которой я не знаком), я обнаружил, что происходит lock xadd DWORD PTR [rdx], eax
. Итак, мой вопрос -
Есть ли в некоторых архитектурах инструкции, относящиеся к atomi c, которые гарантируют отсутствие вытеснения? Или я неправильно понимаю?
Наконец, мне было интересно узнать о семантике compare_exchange_weak
и compare_exchange_strong
-
Есть ли разница l ie int в механизме повтора или это что-то еще?
EDIT : После прочтения ответов мне интересно еще кое-что
Операции функций-членов atomi c
fetch_add
,
operator++
et c. они сильные или слабые?