Понимание `memory_order_acquire` и `memory_order_release` в C++11C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Понимание `memory_order_acquire` и `memory_order_release` в C++11

Сообщение Anonymous »

Я читаю документацию, а точнее


memory_order_acquire: операция загрузки с таким порядком памяти выполняет
операцию получения в затронутой области памяти: никакие операции чтения или
записи в текущем потоке не могут быть переупорядочены до этой загрузки. Все
записи в других потоках, которые освобождают одну и ту же атомарную переменную,
видны в текущем потоке (см. порядок Release-Acquire ниже).

memory_order_release: операция сохранения с этим порядком памяти
выполняет операцию освобождения: никакие операции чтения или записи в текущем
потоке не могут быть переупорядочены после этого сохранения. Все записи в текущем
потоке видны в других потоках, которые получают ту же атомарную
переменную (см. порядок Release-Acquire ниже), а записи, которые несут
зависимость в атомарной переменной, становятся видимыми в других потоках
, которые используют ту же атомарную переменную (см. порядок Release-Consume ниже)


Эти две биты:

из memory_order_acquire


... никакие операции чтения или записи в текущем потоке не могут быть переупорядочены до этой загрузки...


из memory_order_release


... никакие операции чтения или записи в текущем потоке не могут быть переупорядочены после этого сохранения...


Что именно они означают?

Есть также такой пример

Код: Выделить всё

#include 
#include 
#include 
#include 

std::atomic ptr;
int data;

void producer()
{
std::string* p  = new std::string("Hello");
data = 42;
ptr.store(p, std::memory_order_release);
}

void consumer()
{
std::string* p2;
while (!(p2 = ptr.load(std::memory_order_acquire)))
;
assert(*p2 == "Hello"); // never fires
assert(data == 42); // never fires
}

int main()
{
std::thread t1(producer);
std::thread t2(consumer);
t1.join(); t2.join();
}
Но я не могу понять, где применимы два приведенных мною бита. Я понимаю, что происходит, но не вижу бита переупорядочения, потому что код небольшой.

Подробнее здесь: https://stackoverflow.com/questions/596 ... ase-in-c11
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»