首页 > 后端开发 > C++ > 如何为从向量调用的 C 类成员函数创建线程?

如何为从向量调用的 C 类成员函数创建线程?

Patricia Arquette
发布: 2024-12-25 19:53:12
原创
846 人浏览过

How to Create Threads for C   Class Member Functions Invoked from a Vector?

为类成员函数创建线程

问题:

当以下情况时,如何为类成员函数创建线程该函数是从类向量调用的实例?

示例代码和错误:

考虑以下代码:

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() 不会处理这个隐藏参数,导致将成员函数转换为函数指针时出现类型不匹配。

解决方案:

有两种方法对于这个问题:

  1. 使用静态类method:

此方法没有 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);
登录后复制
  1. 使用一个普通的普通函数:

这个方法使用类定义之外的函数,它可以访问类及其成员如下所示:

// 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板