利用BOOST, 成员函数做线程

来源:互联网 发布:java缓存技术 面试 编辑:程序博客网 时间:2024/06/05 08:44

项目中为满足一对多的socket连接,启动任意个监听(配置文件控制),需要使得监听线程动态可配.

通常线程是全局的,静态的,不能满足要求,因此需求是使得线程函数为类的非静态成员函数,类本身可以根据配置生成N个实例.


在这里我利用BOOST的线程系列函数来完成这种操作,具体如下:

1,声明一个线程池, 例如: boost::thread_group m_Threads;

2.装载并启动若干个线程: m_Threads.create_thread(boost::bind(&XXClass::XXXThread, this))

create_thread 这个函数没什么可说,和AfxBeginThread差不多,用来启动线程.

XXXThread是XXClass的成员函数, 本质上成员函数等用于普通函数,只不过相比于普通函数,隐含传递了this指针.

在这里使用&XXClass::XXXThread来获得该函数内存地址,然后通过boost::bind将该函数,和当前实例的this指针进行绑定.

这样操作后,实际执行的线程和成员函数没什么区别,类实例内部的资源都可以使用.

这样的话,不同实例执行相同的操作,启动的线程跟随各个实例,实现了多样性.

另外, boost::bind是个骚操作,具体了解可以搜索引擎.


随手写个测试:


// testBoost.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>#include <boost/thread/thread.hpp>  #include <boost/bind.hpp>class CTestThread{public:CTestThread(int nNum):m_nThreadNum(nNum){}~CTestThread(){}void TestThread(){printf("Thread ID %ld -- Thread Num: %d \r\n", GetCurrentThreadId(), m_nThreadNum);}void BeginThread(){threadGroups.create_thread(boost::bind(&CTestThread::TestThread, this));}private:int m_nThreadNum;boost::thread_group threadGroups;};int _tmain(int argc, _TCHAR* argv[]){CTestThread t1(11);CTestThread t2(22);CTestThread t3(33);CTestThread t4(44);t1.BeginThread();t2.BeginThread();t3.BeginThread();t4.BeginThread();system("pause");return 0;}



原创粉丝点击