现在我们有一个这样的问题:
对一个初始数据A的处理我们能分为两个步骤:
步骤1 :把数据A处理成中间数据B,,需要2s。
步骤2:把中间数据B处理成最终数据C,需要3s。
如果我们写一个单线程的函数,即顺序执行,那么每处理一个数据需要5s。现在我们想对数据处理进行提速:能否缩小处理数据的处理时间?
于是我们想到了多线程。
即:设计两个线程th1,th2,th1处理第一步,th2处理第二步。两个线程并行处理数据,这样处理一个数据的时间就减小至3s。
learn_thread.h
#include<thread>
#include<iostream>
#include<mutex>
#include<vector>
using namespace std;
class learn_thread
{
public:
learn_thread(){}
void th1();
void th2();
vector<int> data;
mutex mutex_;
};
learn_thread.cpp
#include"learn_thread.h"
//用睡眠2s代替步骤一的处理时间、用睡眠3秒代表步骤二的处理时间。
//共10个初始数据(A),分别为0至9
void learn_thread::th1()
{
for(int i=0;i<10;i++)
{
::_sleep(2000);
unique_lock<mutex> wlock(mutex_);
// ::_sleep(2000);//两个线程有交集的时间就是互斥量锁住的时间,如果把睡眠2s写在这里,多线程的意义就失去了。
data.push_back(i+1); //用+1代表步骤一对初始数据A的处理。
cout<<" --------第"<<i<<"个数据 after th1------------ "<<data.back()<<endl;
}
}
void learn_thread::th2()
{
for(int i=0;i<10;i++)
{
while(data.empty()){cout<<"wait the waitthread "<<endl;}
unique_lock<mutex> wplock(mutex_);
::_sleep(3000);
data.back()+=2;//用+2代表步骤二对中间数据B的处理,处理后得到C存放原来的位置。
cout<<"------------第"<<i<<"个数据 after th2---------: "<<data.back()<<endl;
}}
main.cpp
#include"learn_thread.h"
int main()
{
learn_thread *test=new learn_thread();
thread writetest(&learn_thread::th1,test);
thread printtest(&learn_thread::th2,test);
th1.join();
th2.join();
for(vector<int>::iterator it=test->data.begin();it!=test->data.end();it++)
cout<<"after process : "<<*it<<endl;
delete test;
system("pause");
}
运行结果: