利用BOOST, 成員函式做執行緒
阿新 • • 發佈:2019-01-10
專案中為滿足一對多的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; }