將類別成員函數合併到執行緒中
在C 中,類別成員函數本質上帶有一個稱為「this」的隱藏參數。這在嘗試使用成員函數建立執行緒時帶來了挑戰,因為標準函式庫的 pthread_create() 函數需要一個沒有此類參數的函數指標。
編譯錯誤:無法轉換函數指標
如初始程式碼片段所示,嘗試將類別成員函數傳遞給pthread_create() 會直接導致編譯錯誤:
pthread_create(&t1, NULL, &c[0].print, NULL);
編譯器抱怨它無法將成員函數指標(void* (tree_item::*)(void*)) 轉換為預期的函數指標型別 (void* (*)(void *)).
解:靜態類別方法或獨立函數
要規避此問題,有兩種可行的方法:
靜態類別方法:
定義一個封裝靜態類別方法(不接受“ this」指標)所需功能:
class C { public: void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } };
獨立函數:
建立一個單獨的函數,作為類別成員函數的包裝器,顯式傳入「this」指標作為參數:
void hello_wrapper(void *context) { C *object = (C *)context; object->print(); }
使用靜態類別方法或包裝函數建立執行緒
透過這兩種方法中的任何一種,您現在可以使用pthread_create() 建立將執行所需的類別成員函數的執行緒:
C c; pthread_create(&t, NULL, &C::hello_helper, &c); // Static Class Method pthread_create(&t, NULL, &hello_wrapper, &c); // Wrapper Function
以上是如何在 pthread 中使用 C 類別成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!