std atomic 用法示例
时间: 2023-11-01 18:06:45 浏览: 48
下面是一个使用`std::atomic`的简单示例:
```c++
#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> counter(0);
void incrementCounter()
{
for (int i = 0; i < 1000000; ++i)
{
counter++;
}
}
int main()
{
std::thread t1(incrementCounter);
std::thread t2(incrementCounter);
t1.join();
t2.join();
std::cout << "Counter value: " << counter << std::endl;
return 0;
}
```
这个示例创建了一个`std::atomic<int>`类型的变量`counter`,并在两个线程中分别对它进行自增操作。由于`std::atomic`提供了原子操作的保证,因此可以保证多线程环境下的安全性。最后输出`counter`的值,应该是2000000。
相关问题
std::atomic的用法
`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`)等。
c++atomic 用法
C++中的atomic是一个原子类型,可以保证在多线程并发访问时的数据安全性。使用atomic类型可以避免多线程访问同一变量时的数据竞争问题,从而提高程序的并发性能。
atomic类型的使用方式和普通类型差不多,只需要在变量声明时加上atomic即可。例如:
```c++
#include <atomic>
#include <iostream>
using namespace std;
int main() {
atomic<int> num(0);
num++; // 自增操作是原子操作
cout << num << endl;
return 0;
}
```
在上面的代码中,我们使用了一个atomic<int>类型的变量num,对其进行自增操作时,可以确保自增操作的原子性。
除了自增操作,还有其他常用的atomic操作,比如:
- 加法操作:fetch_add()
- 减法操作:fetch_sub()
- 交换操作:exchange()
- 逻辑与/或/异或操作:fetch_and(), fetch_or(), fetch_xor()
需要注意的是,atomic类型只能用于支持原子操作的数据类型,比如整型、指针等。如果要使用其他类型,可以通过重载运算符实现。