CThreadGroupEx对thread_group进行了封装,实现了函数执行体的内置,可以很好地控制各个线程。新增任务的任务可以实现有序执行。
#include<ctime>
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
using namespace boost;
typedef boost::mutex CMutex;
typedef boost::lock_guard<CMutex> CLockGuardMutex;
typedef boost::asio::io_service CIoSrv;
typedef boost::asio::io_service::work CWork;
typedef boost::asio::io_service::strand CStrand;
typedef boost::thread_group CThreadGroup;
CMutex oMutexConsole;//输出不能共享,互斥访问缓冲区
void Download(int series)
{
CLockGuardMutex oLockGuardMutex(oMutexConsole);
cout << "电视剧《神雕侠侣》第" << series << "集" << endl;
this_thread::sleep(posix_time::seconds(rand()%3));
}
class CThreadGroupEx{
private:
CIoSrv oIoSrv;//任务队列
CWork oWork;//无序执行
CStrand oStrand;//按序执行
CThreadGroup oThreadGroup;//线程组对象
public:
CThreadGroupEx() : oWork(oIoSrv), oStrand(oIoSrv){}
void Start(int threads){//创建线程
for(int i = 0; i < threads; i++){
oThreadGroup.create_thread(boost::bind(&CThreadGroupEx::Run, this, i));
}
}
void Stop(){
oIoSrv.stop();//停止服务
oThreadGroup.join_all();//等待所有线程退出
}
void NewTaskWithoutOrder(){//新增几个任务
oIoSrv.post(boost::bind(Download, 10));
oIoSrv.post(boost::bind(Download, 21));
oIoSrv.post(boost::bind(Download, 32));
oIoSrv.post(boost::bind(Download, 43));
oIoSrv.post(boost::bind(Download, 54));
oIoSrv.post(boost::bind(Download, 65));
oIoSrv.post(boost::bind(Download, 76));
oIoSrv.post(boost::bind(Download, 87));
oIoSrv.post(boost::bind(Download, 98));
}
//有序执行的代价是多余的等待
void NewTaskByOrder(){//新增几个任务
oStrand.post(boost::bind(Download, 10));
oStrand.post(boost::bind(Download, 21));
oStrand.post(boost::bind(Download, 32));
oStrand.post(boost::bind(Download, 43));
oStrand.post(boost::bind(Download, 54));
oStrand.post(boost::bind(Download, 65));
oStrand.post(boost::bind(Download, 76));
oStrand.post(boost::bind(Download, 87));
oStrand.post(boost::bind(Download, 98));
}
private:
virtual void Run(int threadno){
boost::system::error_code oErrCode;
oIoSrv.run(oErrCode);
}
};
void main()
{
srand((unsigned)time(NULL));//设置随机数的种子
CThreadGroupEx oThreadGroupEx;
oThreadGroupEx.Start(3);
//oThreadGroupEx.NewTaskWithoutOrder();
oThreadGroupEx.NewTaskByOrder();
this_thread::sleep(posix_time::seconds(30));
oThreadGroupEx.Stop();
}