Требуется ли барьер памяти или атомарная операция в цикле ожидания ожидания?

Рассмотрим следующее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: барьер памяти в одной нити

В принципе: да, если выполнение программы перемещается с одного ядра на другое, оно может не увидеть все записи, которые произошли на предыдущем ядре.

Q: барьер памяти и очистка кеша

Практически во всех современных архитектурах кэши (например, кэши L1 и L2) обеспечиваются согласованным с помощью аппаратного обеспечения. Нет необходимости очищать кеш, чтобы сделать память видимой для других процессоров.

Вопрос: Является ли моя реализация спин-блокировки правильной и оптимальной?

В: Для спин-блокировки всегда требуется барьер памяти? Дорого ли крутится барьер памяти?

Вопрос: Ожидаете ли вы, что будущие поколения процессоров не будут связанными с кэшем?

Ответы на вопрос(3)

Ваш ответ на вопрос