首頁 > 後端開發 > C++ > 如何正確為C類成員函數建立線程?

如何正確為C類成員函數建立線程?

Barbara Streisand
發布: 2024-12-22 04:48:09
原創
841 人瀏覽過

How to Correctly Create Threads for C   Class Member Functions?

在類別成員函數上建立執行緒

使用 C 類別時,一個常見的挑戰是在成員函數上建立執行緒。考慮以下類別:

class c { 
    // ...
    void *print(void *){ cout << "Hello"; }
}
登入後複製

假設我們有一個 c 物件向量,並且想要在 c.print() 函數上建立一個執行緒。但是,以下程式碼會導致錯誤:

pthread_create(&t1, NULL, &c[0].print, NULL);
登入後複製

錯誤訊息表示函數指標與 pthread_create() 的第三個參數的預期類型不符。

解:

出現該錯誤是因為C類成員函數有一個隱式傳遞的隱藏this參數。 pthread_create() 不知道使用哪個 c 實例作為 this 參數。為了解決這個問題,我們需要使用靜態類別方法(沒有 this 參數)或普通函數來引導類別。

靜態類別方法方法:

class C
{
public:
    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};

// ...

C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);
登入後複製

這種方法定義了一個靜態類別方法hello_helper(),它沒有this 參數,並且包裝了對hello( )成員的呼叫

普通函數方法:

void hello(void *context)
{
    C *c = (C *)context;
    c->hello();
}

// ...

C c;
pthread_t t;
pthread_create(&t, NULL, &hello, &c);
登入後複製

這裡,我們定義一個普通函數hello(),它接受一個傳遞給它的void 指標並將其轉換為c. 的實例然後我們在c 實例上呼叫hello() 成員函數。

以上是如何正確為C類成員函數建立線程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板