在多线程领域,经常会遇到在线程执行中调用类成员函数的需要。然而,由于 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中文网其他相关文章!