Passing Class Functions to pthread_create()
Let's consider a scenario where we🎜>
Let's consider a scenario where we🎜>Let's consider a scenario where we have a C unc containing a mprint" which we want to execute in a separate thread using pthread_create().然而,我們遇到了一個編譯錯誤:
pthread_create(&t1, NULL, &c[0].print, NULL);
的原因此錯誤是由於 C類別成員函數隱含包含一個指向目前類別的 this 指標作為其第一個參數。然而,pthread_create() 期望一個標準函數指針,它沒有 this 指針。因此,編譯器無法將此類函數指標轉換為 pthread_create() 所需的函數類型。
解決方案為了解決這個問題,我們需要採用一種替代方法,讓我們可以從pthread_create() 中呼叫類別成員函數。有兩種常見的方法:
使用靜態類別方法class C { public: static void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } }; int main() { pthread_t t; pthread_create(&t, NULL, &C::hello, NULL); ... }靜態類別方法不包含 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(); } }; int main() { C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c); ... }另一種方法是建立將類別成員函數包裝為普通函數的包裝函數。這個包裝函數接受類別實例作為其第一個參數,並呼叫成員函數,如下所示:
以上是如何將 C 類別成員函數傳遞給 pthread_create()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!