問題:
當下列情況時,如何為類別成員函數建立執行緒該函數是從類別向量呼叫的實例?
示例代碼和錯誤:
考慮以下代碼:
class c { void *print(void *) { std::cout << "Hello"; } }; std::vector<c> classes; pthread_t t1; classes.push_back(c()); classes.push_back(c()); // Attempt to create a thread for c.print() pthread_create(&t1, NULL, &c[0].print, NULL); // Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"
解釋:
出現該錯誤是因為C類成員函數有一個隱式的this參數,該參數是內部傳遞的。但是,pthread_create() 不會處理這個隱藏參數,導致將成員函數轉換為函數指標時出現類型不符。
解:
有兩種方法對於這個問題:
此方法沒有this參數,因為它與類別本身關聯,而不是實例。像這樣:
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
這個方法使用類別定義之外的函數,它可以存取類別及其成員如下:
// Outside the class void c_print_wrapper(c *c_instance) { c_instance->print(); } ... c c1, c2; pthread_t t1; classes.push_back(c1); classes.push_back(c2); // Create the thread for c.print() using wrapper function pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);
以上是如何為從向量呼叫的 C 類成員函數建立線程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!