[英]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.