繁体   English   中英

修改和读取原子变量

[英]Modify and read from an atomic variable

一个班级有以下成员,

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

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

int currentId = ++clientId.load();

这里有比赛条件吗? 我正在尝试做类似的事情来生成clientId。 多个线程可以执行这部分代码。 一个已经增加了clientId并且在尝试加载()并获取副本之前,另一个线程会增加相同值并因此导致竞争状态的线程是否可以? 如果是,使用互斥对象进行保护是使用普通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) + 1 ,并且fetch_add的默认内存顺序为std::memory_order_seq_cst

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM