c++atomic 用法
时间: 2024-06-01 20:07:10 浏览: 161
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类型只能用于支持原子操作的数据类型,比如整型、指针等。如果要使用其他类型,可以通过重载运算符实现。
相关问题
linux c++ std::atomic
引用中提供了三个std::atomic_flag的成员函数,分别是test_and_set、clear和exchange。test_and_set函数用于设置atomic_flag并返回之前的状态,clear函数用于清除atomic_flag的状态,exchange函数用于替换atomic_flag的值并返回之前的值。这些函数可以用来实现自旋锁。引用中还提供了一个std::atomic的成员函数exchange,用于替换atomic的值并返回之前的值。引用中给出了std::atomic的store、load、operator和exchange等成员函数的用法和示例。因此,在linux c中,可以使用std::atomic来实现原子操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [linux c/c++ 原子操作库 atomic atomic_flag 简介](https://blog.csdn.net/whatday/article/details/122298078)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
std atomic 用法示例
下面是一个使用`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。
阅读全文