c++thread学习(1)
现在我们有一个这样的问题:
对一个初始数据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"); }
运行结果: