pthread function from a class(类中的 pthread 函数)
问题描述
假设我有一个类,例如
class c {
// ...
void *print(void *){ cout << "Hello"; }
}
然后我有一个 c 的向量
And then I have a vector of c
vector<c> classes; pthread_t t1;
classes.push_back(c());
classes.push_back(c());
现在,我想在 c.print();
下面给了我下面的问题:pthread_create(&t1, NULL, &c[0].print, NULL);
And the following is giving me the problem below: pthread_create(&t1, NULL, &c[0].print, NULL);
错误输出:无法将‘void* (tree_item::)(void)’转换为‘void*()(void)’ 用于参数 ‘3’ 到 ‘int pthread_create(pthread_t*, constpthread_attr_t*, void* ()(void), void*)’
Error Ouput: cannot convert ‘void* (tree_item::)(void)’ to ‘void* ()(void)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* ()(void), void*)’
推荐答案
你不能按照你写的方式来做,因为 C++ 类成员函数有一个隐藏的 this
参数传入.pthread_create()
不知道要使用什么 this
的值,所以如果你试图通过将方法转换为适当类型的函数指针来绕过编译器,你会出现分段错误.您必须使用静态类方法(没有 this
参数)或普通函数来引导类:
You can't do it the way you've written it because C++ class member functions have a hidden this
parameter passed in. pthread_create()
has no idea what value of this
to use, so if you try to get around the compiler by casting the method to a function pointer of the appropriate type, you'll get a segmetnation fault. You have to use a static class method (which has no this
parameter), or a plain ordinary function to bootstrap the class:
class C
{
public:
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);
这篇关于类中的 pthread 函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:类中的 pthread 函数
基础教程推荐
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04