在多執行緒領域,經常會遇到在執行緒執行中呼叫類別成員函數的需要。然而,由於 C 類成員函數中隱藏的「this」參數,此任務可能會帶來挑戰。
例如,考慮以下內容:
class C { void *print(void *) { cout << "Hello"; } };
現在,讓我們建立一個向量C 實例:
vector<C> classes; pthread_t t1; classes.push_back(C()); classes.push_back(C());
要建立一個執行 c.print()的線程,您可能會直觀地write:
pthread_create(&t1, NULL, &c[0].print, NULL);
但是,這會導致錯誤:
cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’
出現這個問題是因為pthread_create() 需要一個特定類型的函數指針,而c[0] .print 是一個指向帶有隱藏「this」參數的成員函數的指標。
要克服這個障礙,你有兩個選擇:
靜態類方法沒有「this」參數,可以直接呼叫而無需類別的一個實例。以下是如何為hello 函數實作靜態類別方法:
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } };
然後,您可以使用靜態類別方法建立執行緒:
pthread_create(&t, NULL, &C::hello, NULL);
另一種選擇是使用封裝成員函數並明確提供“this”參數的函數指標。然後可以使用該函數指標建立線程。
C c; pthread_create(&t, NULL, &C::hello_helper, &c);
其中hello_helper 定義為:
void *hello_helper(void *context) { return ((C *)context)->hello(); }
透過使用靜態類別方法或函數指針,您可以安全地在執行緒內呼叫類別的成員函數,避免「this」參數問題。
以上是如何從執行緒安全地呼叫C類成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!