c 類內多執行緒

2021-08-14 01:17:08 字數 1948 閱讀 7836

有很多時候,我們希望可以在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...