當執行緒函式為C 類成員函式時

2021-08-10 22:53:46 字數 2016 閱讀 1962

很多時候我們在c++多執行緒開發時,都會或多或少遇到執行緒函式為c++類中的某個成員函式,此時可能會發生什麼呢?你有可能會雜麼做呢?

接下來我就為大家總結一下我在這方面走過的乙個歷程

記得我在之前在寫乙個udp傳輸檔案的程式時,我就第一次遇到了執行緒函式為c++類的成員函式,當時遇到的問題,大概意思如下:

#include

#include

#include

class test

void print(void)

private:

std::thread testthread_;

};int main(int argc,char **argv)

如上述**,當我編譯時會產生如下編譯結果

根據第乙個error報錯,貌似程式希望我們把print函式設為靜態函式,第二個error則意思是我們傳遞的引數不能和std::thread所匹配。我的前幾篇博文有寫過std::thread相關的知識,它的第乙個引數為函式指標,而我們的標準c++裡這樣是獲取不到其成員函式的指標的所以才會產生上述的報錯。關於c++獲取其成員函式方面的知識,請參考這個鏈結

根據一種的報錯,我想我們想到的最簡單的方法就是把成員函式設成靜態成員函式

具體如下

#include

#include

#include

class test

static

void print(void)

private:

std::thread testthread_;

};int main(int argc,char **argv)

這個**解決了我在一中遇到的問題

2中似乎表面上解決了我的問題,但事實上由於2的解決方案,我又遇到了新的問題

#include

#include

#include

class test

static

void print(void)

private:

int n;

std::thread testthread_;

};int main(int argc,char **argv)

在上述**中,當我的執行緒函式在使用類的成員函式時,編譯時會報錯

這是因為,我們的靜態成員函式並不能使用非靜態的成員變數(因為它沒有某個具體物件的this指標)

解決方案很簡單,我們只需給靜態成員函式傳遞某物件的this指標即可

具體如下

#include

#include

#include

class test

static

void print(test *pt)

private:

int n;

std::thread testthread_;

};int main(int argc,char **argv)

#include

#include

#include

#include

class test

void print(void)

private:

int n;

std::thread testthread_;

};int main(int argc,char **argv)

我們可以像上述**那樣只需用c++11新標準的std::bind函式將其成員函式與對應的物件指標(即this指標)繫結之後便可高枕無憂的解決我們上述的所有問題

類成員函式作為執行緒函式

include windows.h include class exampletask void exampletask taskmain lpvoid param void exampletask starttask int main int argc,char argv 出現編譯錯誤 error...

類成員函式作為執行緒函式

黙 座 類成員函式作為執行緒函式 2011 01 10 14 54 43 分類 windows 字型大小 訂閱 類成員函式不能作為執行緒函式 一般來說,c 的類成員函式不能作為執行緒函式。這是因為在類中定義的成員函式,編譯器會給其加 上this指標。請看下列程式 include windows.h ...

c 過載為類的成員函式

成員函式返回本物件自己或者自己的拷貝 return this對應complex 則返回物件本身 物件的引用 return this對應complex 則返回物件的副本 return this對應complex 則返回物件當前位址 指向當前物件的指標 返回新的物件,呼叫建構函式 return comp...