修改和读取原子变量
Modify and read from an atomic variable
一个类有以下成员,
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) + 1
,fetch_add
的默认内存顺序是std::memory_order_seq_cst
。
相关文章:
- 从字符串变量中逐字符读取单词
- C++:如何读取分离变量,然后读取向量
- 全局变量 多读取器 一个写入器多线程安全?
- 在指向函数中读取变量时出现分割错误
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- C++编译器是否优化了顺序静态变量读取?
- 逐行读取文件,并将数据插入变量和数组中
- 尝试通过共享指针使用变量时读取访问冲突
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- 警告:左移计数 >= 在 C++ 中将字节流读取为双精度变量时的类型宽度
- 可视化C++从文件中保存/读取多个变量
- 关于读取有效 c++ 第 4 项(将非局部静态变量替换为局部静态变量)的问题
- 多个线程可以读取同一个类成员变量吗?
- 如何从excel文件中读取数据并存储到变量中?
- 在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 读取多个字符串行,c++ 读取多个变量;
- C++模板以从成员变量或成员函数中读取值