4

如果我有一个原子变量,例如,

std::atomic<int> x;

我想对其执行读写操作,我可以使用“正常”语法,例如,

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

我还可以使用显式loadstore成员函数:

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

我见过像 Andrei Alexandrescu 和 Anthony Williams 这样的人建议只使用显式loadstore形式,大概是因为“正常”形式并不强调变量是原子的。这似乎几乎是匈牙利符号的一种形式。读写原子时使用的语法是否有新的约定?

4

1 回答 1

10

几个操作被重载以“做你想做的”,并以顺序一致的内存顺序来做到这一点。所以:

  • 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).

这个想法是看起来“自然”的代码通常是正确的(回想一下“无数据竞争程序的顺序一致”执行模型),但是可以使用风险更大、更激进的操作——它们只需要明确。

于 2014-05-17T00:10:27.100 回答