C++中的原子操作
一、概述
C++11提供了一个原子类型 std::atomic<T>, 通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定 bool、char、int、long、指针 等类型作为模板参数(不支持浮点类型和复合类型)。
原子指的是一系列不可被CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核CPU下,当某个CPU核心开始运行原子操作时,会先暂停其它CPU内核对内存的操作,以保证原子操作不会被其它CPU内核所干扰。
由于原子操作是通过指令提供的支持,因此它的性能相比锁和消息传递会好很多。相比较于锁而言,原子类型不需要开发者处理加锁和释放锁的问题,同时支持修改,读取等操作,还具备较高的并发性能,几乎所有的语言都支持原子类型。
二、实验
1. 原子变量计数与耗时实验
(1) counter_test.cpp
#include <thread> #include <atomic> #include<mutex> #include <iostream> using namespace std; #define POLICY_ATOMIC //POLICY_MUTEX POLICY_ATOMIC POLICY_NO const int maxCnt = 1000000; #ifdef POLICY_NO int gConter = 0; void mythread() { for (int i = 0; i < maxCnt; i++) { gConter++; //线程同时操作变量 } } #endif #ifdef POLICY_MUTEX int gConter = 0; mutex mut; void mythread() { for (int i = 0; i < maxCnt; i++) { mut.lock(); //加锁操作 gConter++; mut.unlock(); } } #endif #ifdef POLICY_ATOMIC atomic<int> gConter; void mythread() { for (int j = 0; j < maxCnt; j++) { gConter++; } } #endif int main() { auto begin = chrono::high_resolution_clock::now(); thread t1(mythread); thread t2(mythread); t1.join(); t2.join(); auto end = chrono::high_resolution_clock::now(); cout << "gConter=" << gConter << endl; cout << "time: " << chrono::duration_cast<chrono::microseconds>(end - begin).count() * 1e-6 << "s" << endl; //秒计时 }
(2) 结果
~/tmp/3.cpp_test/2.atomic$ g++ -std=c++11 counter_test.cpp -lpthread -o pp ~/tmp/3.cpp_test/2.atomic$ ./pp gConter=1487831 time: 0.0155s ~/tmp/3.cpp_test/2.atomic$ ./pp 使用muetx gConter=2000000 time: 0.192604s ~/tmp/3.cpp_test/2.atomic$ ./pp 原子操作的 gConter=2000000 time: 0.052044s
posted on 2024-04-23 16:36 Hello-World3 阅读(534) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)