首先談到在c++中建立執行緒的方法,csdn 2010版介紹如下:
handle winapi createthread(
_in_opt_ lpsecurity_attributes lpthreadattributes, //安全屬性,一般設定為null即可
_in_ size_t dwstacksize, //一般設定為0就可
_in_ lpthread_start_routine lpstartaddress, //程式入口位址,這就是問題的重點
_in_opt_ lpvoid lpparameter, //可以傳入的任意指標變數,可以好好利用
_in_ dword dwcreationflags, //該變數確定執行緒是否即可執行,為0即可執行,
//為create_suspended則掛起
_out_opt_ lpdword lpthreadid //輸出id,可以直接傳入null
在此主要關注引數 lpthread_start_routine lpstartaddress,其型別 lpthread_start_routine定義為如下:
dword (winapi *pthread_start_routine)(
lpvoid lpthreadparameter
因為必須指定為winapi函式呼叫型別,即_stdcall,但是作為c++內成員函式,其函式型別為thiscall,故不滿足要求。
解決方法有多種,下面介紹一下其中之二:
將其宣告為靜態成員函式,即宣告為static dword winapi threadfun(lpvoid *lparam);此時函式呼叫型別變為了_stdcall,滿足要求。但是問題出現了,靜態成員函式是只能訪問類的靜態成員,不能訪問其他成員的。因為靜態成員函式被呼叫時可能類的物件還沒有建立,如果能夠保證呼叫時類物件已建立,則可以使用lpparameter傳入this指標,在threadfun中將其強制轉換為類物件指標型別,用於訪問普通成員及成員函式。但是個人在實踐中發現這種方法是存在問題的()。
2.不定義類成員函式為執行緒函式,而將執行緒函式定義為類的友元函式。這樣,執行緒函式也可以有類成員函式同等的許可權,並且函式呼叫型別為_stdcall,滿足所有要求,能夠解決方法1中存在的一些bug;
具體實現方法可參考:
C 執行緒訪問類成員
當你想用執行緒函式呼叫類的成員函式時,需要將執行緒函式宣告為類的static成員。由於執行緒函式是乙個由系統呼叫的函式,所以是乙個callback函式,所以他不能有this 指標,所以你的執行緒函式要麼是全域性函式,要麼是類的靜態成員。還有一種好的解決辦法 將執行緒函式申明成友員函式,這樣能夠傳入該...
關於執行緒訪問類成員的問題
當你想用執行緒函式呼叫類的成員函式時,需要將執行緒函式宣告為類的static成員。由於執行緒函式是乙個由系統呼叫的函式,所以是乙個callback函式,所以他不能有this 指標,所以你的執行緒函式要麼是全域性函式,要麼是類的靜態成員。還有一種好的解決辦法 將執行緒函式申明成友員函式,這樣能夠傳入該...
關於執行緒訪問類成員的問題
當你想用執行緒函式呼叫類的成員函式時,需要將執行緒函式宣告為類的static成員。由於執行緒函式是乙個由系統呼叫的函式,所以是乙個callback函式,所以他不能有this 指標,所以你的執行緒函式要麼是全域性函式,要麼是類的靜態成員。還有一種好的解決辦法 將執行緒函式申明成友員函式,這樣能夠傳入該...