首页 > 后端开发 > C++ > 如何从线程安全地调用C类成员函数?

如何从线程安全地调用C类成员函数?

Mary-Kate Olsen
发布: 2024-12-26 16:38:09
原创
170 人浏览过

How Can I Safely Call C   Class Member Functions from Threads?

在线程中安全地调用类成员函数

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

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