修改和读取原子变量

Modify and read from an atomic variable

本文关键字:变量 读取 修改      更新时间:2023-10-16

一个类有以下成员,

std::atomic<int> clientId{0};

并在其成员函数中给定以下内容,

int currentId = ++clientId.load();

这里是否有竞争条件?我正在尝试做类似的事情来生成客户端 ID。多个线程可以执行这部分代码。一个递增了 clientId 的线程,在它尝试 load(( 并获取副本之前,另一个线程会递增相同的内容,从而最终出现争用条件吗?如果是,使用互斥锁进行保护是使用普通 int 并在互斥锁中获取副本的最佳方式吗?

请解释一下。

std::atomic<int>::load() 不返回引用,因此您不会递增 clientId 的当前值,而是递增临时返回的 load() 值。

您需要做:

int currentId = ++clientId; // no .load()

std::atomic有重载运算符。预递增运算符的内存顺序是 std:: memory_order_seq_cst 1,上面写着:

具有此内存顺序的加载操作执行获取操作,存储执行释放操作,读取-修改

-写入执行获取操作和释放操作,此外还存在一个总顺序,其中所有线程都以相同的顺序观察所有修改(请参阅下面的顺序一致排序(

因此,您可以避免此处的数据竞争情况。

1 标准说++clientId等价于fetch_add(1) + 1fetch_add的默认内存顺序是std::memory_order_seq_cst