首页 >后端开发 >C++ >如何正确为C类成员函数创建线程?

如何正确为C类成员函数创建线程?

Barbara Streisand
Barbara Streisand原创
2024-12-22 04:48:09848浏览

How to Correctly Create Threads for C   Class Member Functions?

在类成员函数上创建线程

使用 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 实例作为 t​​his 参数。为了解决这个问题,我们需要使用静态类方法(没有 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn