atomic CMPXCHG просто сравнивает и обменивается значениями атомарно
Нет, аппаратное обеспечение доступа к кэшу не реализует CMPXCHG как одноатомную по сути атомарную операцию ,Он синтезируется из нескольких мопов, которые загружаются и хранятся отдельно.
Если так работает обычный CMPXCHG, ваши рассуждения будут правильными.Но обычный CMPXCHG не атомарный (для наблюдателей на других ядрах).
lock cmpxchg
декодирует в несколько мопов, которые сохраняют строку кэша «заблокированной» от загрузки дохранить, превращая его в одну атомарную транзакцию, насколько могут видеть любые другие наблюдатели в системе.(т.е. задержка ответа на недействительные MESI или совместное использование запросов для этой строки до тех пор, пока хранилище не завершит работу).Это также делает его полным барьером памяти.
Без lock
, CMPXCHG декодирует в несколько загружаемых мопов, проверяет на равенство, а затем либо сохраняет новое значение, либоне в соответствии с результатом сравнения. Что касается атомарности, то это то же самое, что и add [mem], edx
, который использует ALU для сложения между загрузкой и хранением мопов.то есть это не атомарный, за исключением того же ядра относительно прерываний (потому что прерывания могут происходить только на границе инструкций).
Загрузка и сохранение каждого отдельно atomic, но они не являются единственной атомарной транзакцией RMW. Если другое ядро делает недействительной нашу копию строки кэша и сохраняет новое значение между нашей загрузкой и нашим хранилищем, наш магазин перейдет в другое хранилище,И это другое хранилище появится в глобальном порядке операций в этой строке кэша между нашей загрузкой и хранилищем, нарушая определение «атомарный» = неделимый.