Захват и освобождение памяти в C++
Порядок memory_order_release завершает запись обычных данных перед публикацией флага.
Чтение с memory_order_acquire в другом потоке видит все записи, предшествующие release.
Сначала запишем полезную нагрузку, затем поднимем флаг с release; читатель увидит данные после acquire-load:
#include <atomic>
#include <iostream>
#include <thread>
int main() {
std::atomic<bool> ready{false};
int payload = 0;
std::thread writer([&]() {
payload = 42;
ready.store(true, std::memory_order_release);
});
while (!ready.load(std::memory_order_acquire)) {
}
writer.join();
std::cout << payload << "\n";
return 0;
}
Запишите int, затем store(true, std::memory_order_release) в std::atomic<bool>. Другой поток ждет load(acquire) и читает int.