1. 程式人生 > >利用BOOST, 成員函式做執行緒

利用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;
}