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

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

Сообщение Anonymous »

Я читаю документацию и, более конкретно, < /p>


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

memory_order_release < /strong>: операция хранилища с этим порядком памяти
выполняет операцию релиза: No Reads или написано в текущем
Truded Thate. All writes in the current
thread are visible in other threads that acquire the same atomic
variable (see Release-Acquire ordering below) and writes that carry a
dependency into the atomic variable become visible in other threads
that consume the same atomic (see Release-Consume ordering below)


These two биты: < /p>

from memory_order_acquire < /em> < /p>


... без чтения или записи в текущем потоке может быть повторно порядок перед этой загрузкой ... < /p>
< /blockquote>

< /p>
< /blockquote> memore_order_release < /em> < /p>


... без чтения или записи в текущем потоке может быть повторно зарегистрировано после этого хранилища ... < /p>
< /blockquote>

Что именно они значат? />
#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();
}
< /code>

Но я не могу понять, где применяются два бита, которые я цитировал. Я понимаю, что происходит, но на самом деле я не вижу повторного заказа, потому что код маленький.

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

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

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

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

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

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