利用BOOST, 成员函数做线程

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值