将类成员函数合并到线程中
在 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中文网其他相关文章!