Мое понимание std :: memory_order_acquire и std :: memory_order_release следующим образом:
означает, что нет доступа к памяти, которые появляются после . /> release < /strong> означает, что нет доступа к памяти, которые появляются до < /em> забор для выпуска может быть переупорядочен после ограждения. C ++ 11 < /code> Библиотека позволяет вам указать заборы памяти двумя способами: либо вы можете указать забор в качестве дополнительного аргумента в атомной операции, например: < /p>
Код: Выделить всё
x.load(std::memory_order_acquire);
< /code>
или вы можете использовать std :: memory_order_relaxed < /code> и указать забор отдельно, например: < /p>
x.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire);
Чего я не понимаю, учитывая приведенные выше определения получения и выпуска, почему C ++ 11 специально связывает с помощью с load и release с store ? Да, я видел много примеров, которые показывают, как вы можете использовать приобретение/нагрузку с выпуском/хранилищем для синхронизации между потоками, но в целом кажется, что идея приобретения заборов (предотвращает переупорядочение памяти после оператора) и выброс заборов (предотвращайте переупорядочение памяти перед оператором), что, не так ли, что мне, не так, что, не так, как не так, как не так, как не так, как не так Скажи: < /p>
Я понимаю, что я могу выполнить вышеперечисленное, используя memore_order_relaxed , а затем отдельный оператор Atomic_thread_fence (memore_order_acquire) , но опять же, почему я не могу использовать хранилище с помощью Memory_order_acquire ? Некоторые хранилища, скажем, x = 10 , происходит до Некоторые другие операции выполняют, которые могут повлиять на другие потоки.
Подробнее здесь:
https://stackoverflow.com/questions/368 ... ease-store