std::atomic的用法
时间: 2024-06-23 09:03:01 浏览: 156
`std::atomic`是C++标准库中的一个模板类,用于在多线程环境中提供原子操作,确保数据在并发访问下的可见性和一致性。它提供了对基本数据类型的原子读写,这对于需要在并发情况下保持数据完整性的情况非常重要。
使用`std::atomic`的步骤通常包括:
1. 包含头文件:`#include <atomic>`,这引入了`std::atomic`模板。
2. 定义原子类型:例如,`std::atomic<int> atomicInt;`,这里创建了一个原子整型变量。
3. 原子操作:`atomicInt.store(42, std::memory_order_release);` 或 `atomicInt.fetch_add(1);`,这些操作保证了在多线程环境下数据的一致性,如读取、修改和比较并交换。
- `store()`:用于将新值存储到原子变量,指定内存顺序(如`memory_order_relaxed`、`memory_order_release`等)。
- `load()`:原子地从原子变量加载值。
- `fetch_and()`、`fetch_or()`、`fetch_xor()`:原子地执行相应的操作并返回新的值。
- `compare_exchange_strong()`:如果当前值等于预期值,则替换为新值,否则不做改变。
- `exchange()`:原子地将当前值替换为新值。
4. 使用`std::memory_order_`标志:控制操作在内存模型中的同步行为,如释放顺序(`release`)、获取顺序(`acquire`)等。
相关问题
[Error] use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
这个错误通常表示你在尝试复制一个 `std::atomic` 对象,但是 `std::atomic` 对象是不可拷贝的。它们是被设计为只能被移动的类型,因为在多线程环境中,复制 `std::atomic` 对象可能会导致竞争条件和不一致的状态。
解决这个问题的方法是使用移动语义,而不是复制语义。你可以使用 `std::move` 函数来将一个 `std::atomic` 对象移动到另一个对象中,或者使用 C++11 中的右值引用来实现移动构造函数和移动赋值运算符。例如:
```c++
std::atomic<int> a(42);
std::atomic<int> b(std::move(a)); // 移动构造函数
b = std::atomic<int>(21); // 移动赋值运算符
```
这样做可以避免复制 `std::atomic` 对象,从而避免编译器报告错误。
/home/admin/Developments/HIK Inspire V2.0/Client/Common/src/writing/module/ty/AbstractReceiver.h:59: error: use of deleted function ‘std::atomic<long long int>::atomic(const std::atomic<long long int>&)’ std::atomic<SwCodeId> m_codeId=0; ^
这个错误提示是因为程序中使用了 `std::atomic` 类型的变量 `m_codeId`,但是 `std::atomic` 类型的对象是不可复制的,编译器在编译时会调用 `std::atomic` 类型的复制构造函数,但是该复制构造函数被删除了,从而导致编译错误。
解决这个问题的方法有两种:
1. 使用 `std::atomic` 类型的移动构造函数来替代复制构造函数。例如:
```
std::atomic<SwCodeId> m_codeId = std::atomic<SwCodeId>(0);
```
2. 使用 `std::atomic` 提供的 `load` 和 `store` 成员函数来对 `m_codeId` 进行读写操作。例如:
```
std::atomic<SwCodeId> m_codeId;
// 写入操作
m_codeId.store(0);
// 读取操作
SwCodeId codeId = m_codeId.load();
```
这两种方法都可以避免调用 `std::atomic` 类型的复制构造函数,从而解决编译错误。
阅读全文