在类成员函数上创建线程
使用 C 类时,一个常见的挑战是在成员函数上创建线程。考虑以下类:
class c { // ... void *print(void *){ cout << "Hello"; } }
假设我们有一个 c 对象向量,并且想要在 c.print() 函数上创建一个线程。但是,以下代码会导致错误:
pthread_create(&t1, NULL, &c[0].print, NULL);
错误消息表明函数指针与 pthread_create() 的第三个参数的预期类型不匹配。
解决方案:
出现该错误是因为C类成员函数隐式传递了一个隐藏的this参数。 pthread_create() 不知道使用哪个 c 实例作为 this 参数。为了解决这个问题,我们需要使用静态类方法(没有 this 参数)或普通函数来引导类。
静态类方法方法:
class C { public: static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; // ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
这种方法定义了一个静态类方法 hello_helper(),它没有 this 参数,并且包装了对 hello() 成员的调用
普通函数方法:
void hello(void *context) { C *c = (C *)context; c->hello(); } // ... C c; pthread_t t; pthread_create(&t, NULL, &hello, &c);
这里,我们定义一个普通函数 hello(),它接受一个传递给它的 void 指针并将其转换为c. 的实例然后我们在 c 实例上调用 hello() 成员函数。
以上是如何正确为C类成员函数创建线程?的详细内容。更多信息请关注PHP中文网其他相关文章!