从pthread_create()调用函数时出错

Error while calling function from pthread_create()

本文关键字:调用 函数 出错 pthread create      更新时间:2023-10-16

我在头文件中的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并根据需要将隐藏的第一个参数传递给函数。