執行緒函式訪問類成員的方法

2022-05-14 03:35:23 字數 1226 閱讀 2657

首先談到在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 指標,所以你的執行緒函式要麼是全域性函式,要麼是類的靜態成員。還有一種好的解決辦法 將執行緒函式申明成友員函式,這樣能夠傳入該...