c++11中的多线程编程
现在的计算机CPU一般都是多核,因此如果要充分利用CPU性能那么需要使用多线程编程来提升处理速度。
在c++中我们的main函数就是一个进程,实际上该进程不参与运算,而是有一个线程。
下面简单测试一个单线程和多线程的运行速度的差异:
#include <iostream> #include <thread> #include <string> #include <vector> #include <chrono>//里面包含对于时间的一些定义 #include <ctime>//计算前后时间差异 #include <cstdlib> double caculate(double val){//由于速度太快导致单线程比多线程块 return (val-3)*(val+5)/2; } double caculate2_0(double val){ std::this_thread::sleep_for(std::chrono::milliseconds(10));//让该线程休息10ms return (val-3)*(val+5)/2; } template<typename iterFirst,typename iterEnd,typename Fun>//使用模板写了一个遍历相加的函数 double visitRange(iterFirst iterfirst,iterEnd iterend,Fun fun){ double ans=0.0; for(auto it=iterfirst;it!=iterend;it++){ ans+=fun(*it); } return ans; } int main() { std::vector<double> nums; for(int i=0;i<1000;i++){ nums.push_back(rand()); } auto nowc=clock(); std::cout<<"单线程: "<<std::endl; auto singleAns=0.0; for(auto& num:nums){ singleAns+=caculate(num); } auto finishc=clock(); std::cout<<singleAns<<"用时: "<<finishc-nowc<<std::endl; nowc=clock(); std::cout<<"多线程: "<<std::endl; auto iterfirst=nums.begin(); auto iterhalf=nums.begin()+(nums.size()/2); auto iterend=nums.end(); auto firstHalfAns=0.0; std::thread s([&firstHalfAns,iterfirst,iterhalf](){ firstHalfAns=visitRange(iterfirst,iterhalf,caculate); }); auto secondHalfAns=visitRange(iterhalf,iterend,caculate); s.join();//表示等待该线程执行完毕 finishc=clock(); std::cout<<firstHalfAns+secondHalfAns<<"用时: "<<finishc-nowc<<std::endl; nowc=clock(); std::cout<<"更加耗时的版本: "<<std::endl; std::cout<<"单线程: "<<std::endl; singleAns=0.0; for(auto& num:nums){ singleAns+=caculate2_0(num); } finishc=clock(); std::cout<<singleAns<<"用时: "<<finishc-nowc<<std::endl; nowc=clock(); std::cout<<"多线程: "<<std::endl; iterfirst=nums.begin(); iterhalf=nums.begin()+(nums.size()/2); iterend=nums.end(); firstHalfAns=0.0; std::thread s_2([&firstHalfAns,iterfirst,iterhalf](){ firstHalfAns=visitRange(iterfirst,iterhalf,caculate2_0); }); secondHalfAns=visitRange(iterhalf,iterend,caculate2_0); s_2.join(); finishc=clock(); std::cout<<firstHalfAns+secondHalfAns<<"用时: "<<finishc-nowc<<std::endl; }
结果显示如果本身运行的程序比较简答,那么单线程会更快,因为创建线程等操作也是需要时间的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律