C++原子变量
时间: 2023-07-11 20:14:57 浏览: 139
C++ 原子类型
C++11中引入了原子操作库`<atomic>`,提供了一组原子类型和原子操作函数,用于在多线程环境下对共享数据进行保护。原子操作是指在执行过程中不能被中断的操作,因此可以保证在多线程环境下,对共享数据的操作不会被其他线程干扰,从而避免了竞争问题。
原子类型是指可以被原子操作读写的类型,包括整型、指针类型等。常见的原子类型有`std::atomic<int>`、`std::atomic<long>`、`std::atomic<void*>`等。原子类型的操作函数包括读取、存储、交换、比较等。例如,`std::atomic<int>`类中常用的操作函数有:
- `load()`:读取原子变量的值
- `store(val)`:将原子变量的值设置为`val`
- `exchange(val)`:将原子变量的值交换为`val`,并返回原来的值
- `compare_exchange_strong(expected, val)`:如果原子变量的值等于`expected`,则将其设置为`val`,并返回`true`,否则不修改原子变量的值,返回`false`
- `compare_exchange_weak(expected, val)`:与`compare_exchange_strong`类似,但是在某些平台上可能比较快
使用原子操作时需要注意以下几点:
1. 原子操作只能用于原子类型,不能用于非原子类型。
2. 在多线程环境下,对共享数据的读写应该使用原子操作,避免竞争问题。
3. 原子操作不一定比互斥锁更快,因此在实际使用时应该根据具体情况进行选择。
下面是一个使用原子变量的示例:
```c++
#include <iostream>
#include <atomic>
#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: " << counter << std::endl;
return 0;
}
```
在上面的示例中,我们创建了一个`std::atomic<int>`类型的原子变量`counter`,并在两个线程中进行加1操作,最终输出`counter`的值。由于原子变量的操作是原子的,因此这个程序的输出结果应该是2000000,即两个线程总共对`counter`进行了2000000次加1操作。
阅读全文