从pthread_create()调用函数时出错
Error while calling function from pthread_create()
我在头文件中的class定义中声明了一个函数:
class A
{
public:
...
void* func(void *);
...
}
在。c文件中,我有一个指向类a对象的指针ptr.
现在,当我创建一个pthread:iret1 = pthread_create(&thread1, NULL, ptr->func, NULL);
抛出如下错误:错误:指向绑定函数的指针只能用于调用该函数
但是当我将函数func声明为静态时,这个错误就不会出现了。
我只是想知道一个变通办法,因为我不能把函数改为静态,因为我不能从它调用其他非静态成员
不能将非静态成员函数用作线程函数,也不能用作任何需要函数指针的非c++函数的函数。原因是所有非静态成员函数都有一个隐藏的第一个参数,该参数成为this
指针。
在这种情况下,它可以通过静态代理函数来解决:
class A
{
public:
void* func();
static void* wrapper(void* object)
{ return reinterpret_cast<A*>(object)->func(); }
};
...
A* ptr = new A;
iret1 = pthread_create(&thread1, NULL, &A::wrapper, ptr);
这将创建以A::wrapper
为线程函数的线程,并将实例指针作为参数传递。A::wrapper
函数然后使用这个参数作为指向实例的指针,并调用真正的函数。
但是,如果你有一个支持c++ 11的编译器和标准库,那么对线程的支持会更好:
A myA;
std::thread myThread(&A::func, &myA);
上面的对象创建创建了一个线程,该线程将调用A::func
并根据需要将隐藏的第一个参数传递给函数。
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?