類內成員函式 多執行緒呼叫 除錯記錄

2022-01-31 18:39:27 字數 1179 閱讀 5528

最近工程上需要用到多執行緒呼叫類內成員函式,記錄一下當時出錯的問題,及解決方法。

1.首先 寫法是普通多執行緒呼叫時候的宣告,如下:

void getregresultbyonesetpthread(const

int decodetype, vectorfloat>>&proball,

const

int m_roibegin, const

int m_roiend,const

int topn, const cv::mat& g_oripicmat, string& regjson)

結果會報如下錯誤:

error: invalid use of non-static member function

2.然後查詢資料,得知類內成員函式多執行緒呼叫時需要宣告為static形式,或者傳入this指標才行,(普通成員函式在引數傳遞時編譯器會隱藏地傳遞乙個this指標.通過this指標來確定呼叫類產生的哪個物件)

agent_classifier 為類名。
修改為如下形式:

getregresultbyonesetpthread,this,0, proball, m_roibegin, m_roiend, topn, g_oripicmat,regall);

結果會報如下錯誤:

error: no type named 『type』 in 『class std::result_of

3.原因是 執行緒函式getregresultbyonesetpthread 引數型別有引用型別,必須傳入引用型別才可以:

std::thread t0(&agent_classifier::getregresultbyonesetpthread,this,

0,std::ref

(proball), m_roibegin, m_roiend, topn,std::ref(g_oripicmat),std::ref(regall));

至此編譯通過。

參考:

c 多執行緒之順序呼叫類成員函式

一 場景 leetcode1114 乙個類中三個函式 public class foo public void two public void three 三個不同的執行緒將會共用乙個 foo 例項。執行緒 a 將會呼叫 one 方法 執行緒 b 將會呼叫 two 方法 執行緒 c 將會呼叫 thr...

c 類內多執行緒

有很多時候,我們希望可以在c 類裡面對那些比較耗時的函式使用多執行緒技術,但是熟悉c 物件語法的人應該知道,c 類的成員函式的函式指標不能直接做為引數傳到pthread create,主要因為是c 成員函式指標帶有類命名空間,同時成員函式末尾是會被c 編譯器加上可以接收物件位址的this指標引數。因...

類成員函式呼叫

大家都知道c 的虛函式前必須加virtual,但如果一連串的繼承下來,有的忘了加virtual會出現什麼情況呢?為了滿足我的好奇心,做了點實驗然後有了本文,僅僅是好玩,沒有啥實際意義。本文只給出vs2005的情況 首先,如果是單一類,沒加virtual的話那麼好辦,直接call a fun,非sta...