類成員函數如何作為pthread_create的線程函數?


1. C++成員函數隱藏的this指針

   C++中類的普通成員函數都隱式包含一個指向當前對象的this指針,即:T *pThis,其中T為類類型。

   C++通過傳遞一個指向自身的指針給其成員函數從而實現程序函數可以訪問C++的數據成員。這也可以理解為什么

   C++類的多個實例可以共享成員函數但是確有不同的數據成員。

 

2. 類成員函數如何作為pthread_create的線程函數

   在C++的類中,普通成員函數作為pthread_create的線程函數就會出現參數問題,因為隱含的this指針的存在。

   具體解決方法有如下幾種:

   a. 將函數作為為類內靜態成員函數,即使用static修飾。將this指針作為參數傳遞,以使該方法可以訪問類的非靜態方法或者是變量。

class MyClass
{
public:
    static void* ThreadFunc(void*);
    void Func()
    {
    }

    bool StartThread()
    {
        int ret = pthread_create(&_pthreadId, NULL, MyClass::ThreadFunc, this);
        if(ret != 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
private:
    pthread_t _pthreadId;
};

void* MyClass::ThreadFunc(void *arg)
{
    MyClass *thiz = static_cast<MyClass *>(arg);
    thiz->Func();
    return NULL;
};

   b. 對成員函數進行強制轉換,當作線程的回調函數。具體代碼如下:

class MyClass
{
    /* 定義Func類型是一個指向函數的指針,
       該函數參數為void*,返回值為void*
     */
    typedef void* (*pFUNC)(void *);

public:
    void Func()
    {
    }

    bool StartThread()
    {
        pFUNC callback = reinterpret_cast<pFUNC>(&Func);
        int ret = pthread_create(&_pthreadId, NULL, callback, NULL);
        if(ret != 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
private:
    pthread_t _pthreadId;
};

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM