Можно ли использовать std :: memory_order_acquire и memory_order_release отдельно? - PullRequest
1 голос
/ 03 апреля 2019

cppreference говорит, что std::memory_order_acquire предотвратит переупорядочение чтения и записи перед ним. Поэтому я могу использовать std::memory_order_acquire только для предотвращения переупорядочения во время выполнения без соответствующего std::memory_order_release. Например

#include <atomic>
#include <stdint.h>

std::atomic<uint32_t> g_counter{};//Counter for thread in Fun
std::atomic<void*> g_data{};
void Fun()
{
    g_counter.fetch_add(1, std::memory_order_acquire);//Warning:`fetch_add` maybe reorder after next 'load'
    void *data = g_data.load(std::memory_order_acquire);
    g_counter.fetch_sub(1, std::memory_order_relaxed);//just memory_order_relaxed will be ok
}

Это правда?

1 Ответ

0 голосов
/ 23 апреля 2019

Через пару дней обучения.Я думаю, что «release» и «acuire» могут использоваться отдельно для предотвращения соответствующего переупорядочения.Но с примером что-то не так.Это операция хранилища для 'fetch_add', и хранилище может изменить порядок после следующей загрузки.Правильный путь - это изменить и fetch_add, и следующую загрузку на операцию memory_order_seq_cst.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...