Прежде всего: это зависит!
1.) Если система блокирует строку кэша, она не имеет ничего общего с c ++.Вопрос в том, как организован кэш и, в особенности, как инструкции ассемблера работают с кешем.Это вопрос к архитектуре процессора!
2.) То, как компилятор выполняет атомарную операцию, зависит от реализации.Какие инструкции ассемблера будут сгенерированы для выполнения атомарной операции, может варьироваться от компилятора к компилятору и даже в разных версиях.
3.) Как я знаю, полная блокировка строки кэша - это только запасное решение, еслиникакие «более умные» уведомления / синхронизация других ядер, обращающихся к тем же строкам кэша, не могут быть выполнены.Но обычно задействован не только один кеш.Подумайте о многоуровневой архитектуре кеша.Некоторые кэши видны только одному ядру!Поэтому необходимо также выполнять больше операций системы памяти, например, для блокировки линии.Вы также должны перемещать данные с разных уровней кэша, даже если задействовано несколько ядер!
4.) С точки зрения c ++ атомарная операция - это не только одна операция.Что действительно произойдет, зависит от опций упорядочения памяти для атомарной операции.Поскольку атомарные операции часто используются для межпоточной синхронизации, необходимо сделать гораздо больше для одной атомарной операции RMW!Чтобы понять, что нужно сделать, вы должны дать https://www.cplusplusconcurrencyinaction.com/ шанс.В нем подробно рассматриваются барьеры памяти и упорядочение памяти.
5.) Блокировка строки кеша (если это действительно происходит) не должна приводить к спин-блокировкам или другим вещам на других ядрах в качестве доступа к строке кешасамо заняло всего несколько тактов.В зависимости от архитектуры он просто «держит» другое ядро в течение некоторых циклов.Может случиться так, что «спящее» ядро может параллельно делать другие вещи в другой трубе.Но, эй, это очень специфично для аппаратного обеспечения.
Как уже упоминалось в комментарии: взгляните на https://fgiesen.wordpress.com/2014/08/18/atomics-and-contention/,, он дает некоторые подсказки, что может случиться с когерентностью и блокировкой кэша.
Существует гораздо больше, чем блокировка под капотом.Я считаю, что ваш вопрос царапается только на поверхности!
Для практического использования: не думайте!Поставщики компиляторов и архитекторы процессоров проделали очень хорошую работу.Вы, как программист, должны измерять производительность своего кода.С моей точки зрения: не нужно думать о том, что произойдет, если строки кэша заблокированы.Вы должны писать хорошие алгоритмы и думать о хорошей организации памяти ваших программных данных и меньшем количестве взаимосвязей между потоками.