多线程的好处通过一个程序示例来展示
单线程
#include <iostream>
#include <vector>
#include <algorithm>
#include<numeric>
#include <string>
using namespace std;
int GetSum(vector<int>::iterator first,vector<int>::iterator last)
{
return accumulate(first,last,0);//调用C++标准库算法
}
static string getCurrentTime()
{
time_t t = time(NULL);
char ch[64] ={0};
strftime(ch,sizeof(ch) -1,"%Y-%m-%d %H:%M:%S",localtime(&t));
return ch;
}
int main()
{
cout << getCurrentTime() << endl;
vector<int> largeArrays;
for(int i=0;i<100000000;i++)
{
if(i%2==0)
largeArrays.push_back(i);
else
largeArrays.push_back(-1*i);
}
int res = GetSum(largeArrays.begin(),largeArrays.end());
cout << getCurrentTime() << endl;
return 0;
}
2020-09-22 14:36:36
2020-09-22 14:36:39
编译输出计算时间可以看到大概需要3s。
多线程
#include <iostream>
#include <vector>
#include <algorithm>
#include <thread>
#include <numeric>
#include <string>
using namespace std;
//线程要做的事情就写在这个线程函数中
void GetSumT(vector<int>::iterator first,vector<int>::iterator last,int &result)
{
result = accumulate(first,last,0); //调用C++标准库算法
}
static string getCurrentTime()
{
time_t t = time(NULL);
char ch[64] ={0};
strftime(ch,sizeof(ch) -1,"%Y-%m-%d %H:%M:%S",localtime(&t));
return ch;
}
int main() //主线程
{
cout << getCurrentTime() << endl;
int result1,result2,result3,result4,result5;
vector<int> largeArrays;
for(int i=0;i<100000000;i++)
{
if(i%2==0)
largeArrays.push_back(i);
else
largeArrays.push_back(-1*i);
}
thread first(GetSumT,largeArrays.begin(),
largeArrays.begin()+20000000,std::ref(result1)); //子线程1
thread second(GetSumT,largeArrays.begin()+20000000,
largeArrays.begin()+40000000,std::ref(result2)); //子线程2
thread third(GetSumT,largeArrays.begin()+40000000,
largeArrays.begin()+60000000,std::ref(result3)); //子线程3
thread fouth(GetSumT,largeArrays.begin()+60000000,
largeArrays.begin()+80000000,std::ref(result4)); //子线程4
thread fifth(GetSumT,largeArrays.begin()+80000000,
largeArrays.end(),std::ref(result5)); //子线程5
first.join(); //主线程要等待子线程执行完毕
second.join();
third.join();
fouth.join();
fifth.join();
int resultSum = result1+result2+result3+result4+result5; //汇总各个子线程的结果
cout << getCurrentTime() << endl;
return 0;
}
2020-09-22 14:37:02
2020-09-22 14:37:04
大概需要2s时间
两个程序对比可以看出多线程节约时间。很好理解多个cpu同时计算嘛。
多线程和多进程的关系
火车和火车厢的关系:进程好比火车,火车车厢好比线程。