Требуется ли барьер памяти или атомарная операция в цикле ожидания ожидания?
Рассмотрим следующееspin_lock()
реализация, родом изэтот ответ:
void spin_lock(volatile bool* lock) {
for (;;) {
// inserts an acquire memory barrier and a compiler barrier
if (!__atomic_test_and_set(lock, __ATOMIC_ACQUIRE))
return;
while (*lock) // no barriers; is it OK?
cpu_relax();
}
}
Что я уже знаю:
volatile
предотвращает оптимизацию компилятора*lock
перечитайте на каждой итерацииwhile
петля;volatile
не вставляет ни память, ни барьеры компилятора;такая реализация на самом деле работает в GCC дляx86
(например, в ядре Linux) и некоторые другие архитектуры;хотя бы один барьер памяти и компиляторанеобходимо вspin_lock()
реализация для общей архитектуры; этот пример вставляет их в__atomic_test_and_set()
.Вопросы:
Являетсяvolatile
здесь достаточно или есть какие-либо архитектуры или компиляторы, где требуется барьер памяти или компилятора или атомарная операция вwhile
цикл?
1.1 СогласноC++
стандарты?
1.2 На практике, для известных архитектур и компиляторов, особенно для GCC и платформ, которые он поддерживает?
Это реализациябезопасный на всех архитектурах, поддерживаемых GCC и Linux? (Это как минимумнеэффективный на некоторых архитектурах, верно?)Этоwhile
петля безопасна в соответствии сC++11
а его модель памяти?Есть несколько связанных вопросов, но я не смог составить из них однозначного и однозначного ответа:
В принципе: да, если выполнение программы перемещается с одного ядра на другое, оно может не увидеть все записи, которые произошли на предыдущем ядре.
Q: барьер памяти и очистка кеша
Практически во всех современных архитектурах кэши (например, кэши L1 и L2) обеспечиваются согласованным с помощью аппаратного обеспечения. Нет необходимости очищать кеш, чтобы сделать память видимой для других процессоров.
Вопрос: Является ли моя реализация спин-блокировки правильной и оптимальной?
В: Для спин-блокировки всегда требуется барьер памяти? Дорого ли крутится барьер памяти?
Вопрос: Ожидаете ли вы, что будущие поколения процессоров не будут связанными с кэшем?