天天看點

C++将線程函數作為類成員函數,并在構造函數中建立線程

我們知道在Qt中可以使用 繼承QThread類,然後重載run函數,來啟動線程;

此外還可以使用另一種方法:

線程函數為類成員函數,注意,必須是靜态成員函數,

pthread_create()函數,傳遞this指針參數, 線程函數中将形參強轉為類指針,此時,可以該指針調用類成員變量了。

例如:

class MYFUNC
{
    private:
            int value;
    public:
            MYFUNC();
            static void* foo(void*);    //此處需要添加 static 
};
MYFUNC::MYFUNC():value(3)
{ 
        pthread_t thread;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&thread,&attr,foo,(void*)this);//傳遞this 指針
}
void* MYFUNC::foo(void *arg)
{
    MYFUNC *p = (MYFUNC*)arg;
    cout << p->value;    //因為是靜态函數,是以,要想調用該類成員變量,需要用到該類的指針
}
           

可以參考這篇文章:https://blog.csdn.net/fsc2988877/article/details/1519850

--------在類中定義的成員函數,VC在編譯時會強加一個this指針,是以才會出現您所說的情況。将該成員函數聲明為static類型,可以将this指針除去,但static成員函數隻能通路static成員。

其實用靜态成員函數做線程函數還不錯,可以在調用函數時用param傳入this指針,然後線上程函數中用類型轉換轉換成指向該類的指針,這時該指針就可以通路非靜态變量和私有變量了。

繼續閱讀