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");
}

运行结果:




 

posted on 2016-10-21 14:23  从小白做起  阅读(135)  评论(0编辑  收藏  举报