项目中为满足一对多的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;
}