Да, безопасно использовать без блокировки std::atomic<T>
в совместно используемой памяти, отображаемой различными процессами, во всех основных реализациях C ++ для ARM.
Но атомы без блокировки не будут работать, потому чторазные процессы не будут использовать одну и ту же таблицу блокировок.
Прерывание до завершения strex
приведет к сбою.Вам не нужно беспокоиться о том, чтобы код ядра изменил таблицы страниц между ldrex и strex.
Возобновление этого кода в середине после прерывания на том же или другом процессоре будет означать, что strex
просто не удастся, потому чтоон не выполняется как часть «транзакции», запущенной ldrex
.
. Атомарность не зависит от адреса в ARM и в любой обычной основной системе, которая реализует атомарность без блокировки в C ++ 11.
Все по-прежнему работает, если два потока / процесса на разных ядрах имеют одну и ту же физическую страницу, сопоставленную с разными виртуальными адресами.Стандарт C ++ 11 явно рекомендует, чтобы реализации работали таким образом без блокировок std::atomic<T>
.(Он не требует этого, потому что тогда ему придется определить, что представляет собой процесс, и функции для переназначения виртуальной памяти.)
Это почти дубликат Без блокировкина практике атомные адреса без адреса? . См. цитаты из стандарта и более подробную информацию.
Современные компьютерные системы гарантируют, что в их кешах не возникает проблем с псевдонимами и синонимами.потому что это может вызвать проблемы когерентности в целом, а не только для атомных RMW.Иногда это требует взаимодействия с ядром ОС (например, раскраска страницы, если один бит индекса кэша исходит из номера страницы, а не только части адреса со смещением внутри страницы), но в целом кэши ведут себя как физические.
(Некоторые ранние процессоры, такие как ранние MIPS, иногда использовали виртуально адресованные кэши данных L1, но это не делается в системах, которые могут поддерживать несколько процессоров, AFAIK.)