Если у меня есть атомная переменная, например,
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
формы, предположительно потому, что «нормальные» формы не подчеркивают, что переменные являются атомарными. Это выглядит почти как форма венгерской нотации. Существует ли новое соглашение о синтаксисе, используемом при чтении и написании атомных элементов?
Несколько операций перегружены, чтобы «делать то, что вы думаете», и делать это с последовательным последовательным упорядочением памяти. Так:
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)
,
Идея состоит в том, что «естественно» выглядящий код будет в целом правильным (напомним модель выполнения «последовательно согласованный для программ без данных»), но доступны более рискованные, более агрессивные операции — они просто должны быть явными.