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;
}
复制代码

 

 结果显示如果本身运行的程序比较简答,那么单线程会更快,因为创建线程等操作也是需要时间的。

posted @   海蓝笨  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示