在類別成員函數上建立執行緒
使用 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中文網其他相關文章!