有很多時候,我們希望可以在c++類裡面對那些比較耗時的函式使用多執行緒技術,但是熟悉c++物件語法的人應該知道,c++類的成員函式的函式指標不能直接做為引數傳到pthread_create,主要因為是c++成員函式指標帶有類命名空間,同時成員函式末尾是會被c++編譯器加上可以接收物件位址的this指標引數。因此需要將成員函式做一定的轉化,將其轉化為不被編譯器加上this指標,而由我們自己來為該函式維護」this」指標即可。
#include
#include
#include
#include
using
namespace
std;
class test
;int test::insert()
如上所示,**宣告了乙個類test,假設該類有乙個十分耗時的成員函式:insert(),這個求和函式每次執行需要2000ms的時間。對於如此耗時的函式,我們在設計時都會想方法將其設計為執行緒函式,這樣呼叫者才不會阻塞。
於是我們為其加上多執行緒:
#include
#include
#include
#include
#include
#include
using
namespace
std;
class test
;int test::insert()
void * test::insert_pth(void*)
void test::lanch()
int main()
以上**通過呼叫lanch()來建立多執行緒來執行insert_pth,insert_pth 再呼叫insert().
但是 這樣的**在編譯時即會報錯。
pthread.cpp: in member
function 『void test::lanch()』:
pthread.cpp:30:42: error: invalid use
of non-static
member
function
pthread_create(&pth,null,insert_pth,null);
只需將insert_pth變化為static函式,同時將insert邏輯**轉移到insert_pth即可
#include
#include
#include
#include
#include
#include
using
namespace
std;
class test
;int test::insert()
void * test::insert_pth(void* __this)
void test::lanch()
int main()
使用多執行緒處理耗時成員函式的步驟:
1. 宣告另外乙個靜態函式:static void ***_pth(void __this);
該函式與目標成員函式在函式名盡量保持一致
2. 將原成員函式的**拷貝至void * ***_pth(void * __this);
在 ***_pth()開始處將void * __this 轉化為 物件的指標 objectpoint _this;
將拷貝下來的所有成員變數加上_this->
3. 編寫執行緒啟動**。
注意pthread_create()最後乙個引數傳入this指標
在 ***_pth()函式內容不要呼叫類的其它成員函式,否則成員函式將無法獲取正確的this指標而操作錯誤記憶體,從而導致segmantation fault.
類內成員函式 多執行緒呼叫 除錯記錄
最近工程上需要用到多執行緒呼叫類內成員函式,記錄一下當時出錯的問題,及解決方法。1.首先 寫法是普通多執行緒呼叫時候的宣告,如下 void getregresultbyonesetpthread const int decodetype,vectorfloat proball,const int m...
多執行緒 執行緒內區域性變數
該類提供了執行緒內區域性 thread local 變數。好比有兩個視窗 兩個執行緒 乙個視窗可以拿飲料,乙個視窗可以拿食物。現在有多個人要來拿東西,如果在飲料視窗有的人拿到了飲料,有的人拿到了不該拿的食物,就說明執行緒之間出現了混亂,我們應當避免這種情況出現。以下 就可能會出現執行緒混亂的問題 p...
C 集合類Queue 多執行緒
乙個例子,供自己學習使用 private void button 測試queue結合多執行緒 click object sender,eventargs e foreach string str in cars str console.writeline console.foregroundcolo...