很多時候我們在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...