问题:
当以下情况时,如何为类成员函数创建线程该函数是从类向量调用的实例?
示例代码和错误:
考虑以下代码:
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中文网其他相关文章!