Если переменные std :: atomic используют & quot; нормальные & quot; синтаксис или «загрузить» и & quot; хранить & quot ;?

Если у меня есть атомная переменная, например,

std::atomic<int> x;

и я хочу выполнить чтение и запись на нем, я могу использовать «нормальный» синтаксис, например,

std::cout << x;       // read from x
x = 5;                // write to x

Я также могу использовать явное load а также store функции-члены:

std::cout << x.load();       // read from x
x.store(5);                  // write to x

Я видел рекомендации таких людей, как Андрей Александреску и Энтони Уильямс, использовать только объяснения load а также store формы, предположительно потому, что «нормальные» формы не подчеркивают, что переменные являются атомарными. Это выглядит почти как форма венгерской нотации. Существует ли новое соглашение о синтаксисе, используемом при чтении и написании атомных элементов?

2

Решение

Несколько операций перегружены, чтобы «делать то, что вы думаете», и делать это с последовательным последовательным упорядочением памяти. Так:

  • int n = x; такой же как int n = x.load(std::memory_order_seq_cst), а также
  • x = 1 такой же как x.store(1, std::memory_order_seq_cst),

Однако, если вам нужен какой-либо порядок упорядочения памяти, вам нужно использовать явную функцию-член, например, int n = x.load(std::memory_order_acquire),

Идея состоит в том, что «естественно» выглядящий код будет в целом правильным (напомним модель выполнения «последовательно согласованный для программ без данных»), но доступны более рискованные, более агрессивные операции — они просто должны быть явными.

10

Другие решения


По вопросам рекламы [email protected]