std::atomic 类型变量
时间: 2023-10-22 15:07:35 浏览: 143
std::atomic 是 C++11 新增的一个类型,用于实现原子操作。它可以保证某些操作的原子性,避免多线程操作中的数据竞争问题。通常用于实现线程安全的计数器或标志等。
std::atomic 可以用于所有标量类型(如 int、float 等),也可以用于用户自定义类型(需要自己实现对应的原子操作函数)。
示例代码:
```
#include <atomic>
#include <iostream>
#include <thread>
std::atomic<int> counter(0);
void increment()
{
for (int i = 0; i < 1000000; ++i)
{
++counter;
}
}
int main()
{
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Counter value: " << counter << std::endl;
return 0;
}
```
输出结果:
```
Counter value: 2000000
```
相关问题
error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’ std::atomic<bool> m_BConnectStutas = false; 为什么报错
这个错误是由于 `std::atomic<bool>` 类型的拷贝构造函数被删除(deleted)导致的。`std::atomic` 类型是为了实现原子操作而设计的,它们通常不支持拷贝和赋值操作,以确保线程安全。相反,你应该使用 `std::atomic<bool>` 的默认构造函数来初始化它。
这样写会解决问题:
```cpp
std::atomic<bool> m_BConnectStatus(false);
```
或者在 C++11 之前的标准中,你可以使用普通的 `bool` 类型变量,并使用 mutex 或其他同步机制来保护它的访问。
如果你需要对 `std::atomic<bool>` 进行拷贝或赋值操作,你可以考虑使用 `std::atomic_ref` 类型,它在 C++20 中引入。这样做可以避免拷贝构造函数被删除的问题。
std::atomic<bool> 和 std::atomic_bool区别
`std::atomic<bool>` 和 `std::atomic_bool` 是两种不同的类型,但它们的作用是相同的,都是用于实现原子性的读写操作。
`std::atomic<bool>` 是一个类模板,可以用来创建一个原子的 bool 类型对象。它提供了一系列的成员函数来实现对 bool 类型变量的原子操作,例如 load(), store(), exchange(), compare_exchange_strong(), compare_exchange_weak() 等。
而 `std::atomic_bool` 是一个 typedef,实际上是将 `std::atomic<bool>` 起了一个别名。它并没有提供任何新的功能,只是让代码更加简洁明了,使得用户可以直接使用 `std::atomic_bool` 来代替 `std::atomic<bool>`,而无需再写出模板参数。
总的来说,`std::atomic<bool>` 和 `std::atomic_bool` 在功能上是相同的,但在使用方式上有一些差别。通常来说,建议使用 `std::atomic<bool>`,这样可以更加清晰地表达出变量的类型。
阅读全文