2

可能重复:
类中的 pthread 函数

我正在尝试使用启动例程创建一个线程,但 g++ 不喜欢我的语法。

class myClass
{
  void* myFunction(void* myArg)
  {
    // some code, useless here
  }

  void start()
  {
    pthread_t thread_id;
    int* fd;

    //Some code, useless here.

    pthread_create(&thread_id, 0, &myFunction, (void*) fd);
  }
}

在编译器期间,g++ 告诉我ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&myFunction'.

它不能转换void (myClass::*) (void*)void* (*) (void*)的参数 3 pthread_create

任何的想法 ?

4

6 回答 6

1

您需要将 myFunction 声明为 static 才能将其视为常规函数。

于 2012-10-19T13:26:43.047 回答
0

您不能将常规函数成员用作线程例程。原因是这样的函数成员需要调用上下文 -对胆量this不可用的对象指针。pthread

使这样的功能成员static或只是自由功能。

于 2012-10-19T13:27:17.900 回答
0

您不能将指针传递给非静态方法。您可能想要使用代理函数,将指向您的实例的指针作为参数传递给 pthread_create 并从那里进行 myFunction 调用

于 2012-10-19T13:29:41.673 回答
0

正如编译器所说,您必须在 pthread 中使用静态函数,这样的事情应该可以工作:

class myClass
{
  static void startThread(void* context)
  {
    ((myClass*)context)->myFunction()
  }

  void myFunction()
  {
    // some code, useless here
  }

  void start()
  {
    pthread_t thread_id;

    //Some code, useless here.

    pthread_create(&thread_id, 0, &startThread, this);
  }
}

您还可以使用结构作为上下文,如果需要,您可以在其中传递此参数和其他参数。

于 2012-10-19T13:34:05.900 回答
0

您可以将函数设为静态,也可以使用一些变通方法从类中调用该函数。

void *callMyFunction(void *f)
{
  reinterpret_cast<myClass*>(f)->myFunction();
  return (NULL);
}

class myClass
{
  void* myFunction()
  {
    // some code, useless here
  }

  void start()
  {
    pthread_t thread_id;
    int* fd;

    //Some code, useless here.

    pthread_create(&thread_id, 0, &callMyFunction, (void*) this);
  }
}

如果要将参数传递给myClass::myFunction,则需要创建一个像这样的小结构

struct s_param
{
  void  *ptr;
  int   param1;
  char  param2;
  /* other variables */
};

callMyFunction会成为

void *callMyFunction(void *bundle)
    {
      reinterpret_cast<myClass*>(bundle->ptr)->myFunction(bundle->param1, bundle->param2/*, ...*/);
      return (NULL);
    }
于 2012-10-19T13:36:53.013 回答
0

正如您的编译器所指定的pthread_create期望 avoid* (*)(void*)但您提供的函数具有非常相似但不同的语法:

没有的类的每个函数static都有一个名为thistype的隐藏参数class*,所以现在你的函数void* (*)( class*, void* )与预期的不匹配pthread_create。您应该提供具有相同架构的功能。

此外,如果您的void* someFunction()类中有类似的函数,它可能与预期的函数匹配pthread_create,当然编译器不允许这样做,这也是有原因的。原因是调用约定,即参数如何传递给函数,C++ 编译器允许传入this寄存器!所以它不会与预期的功能匹配pthread_create。这可以通过一些允许您选择函数的调用约定的编译器来解决,但这不是标准的,因此最好的方法是将代理函数编写为:

static void* my_thread_routine_proxy(void* param) {
    static_cast<my_class*>(param)->my_thread_routine();
}

但是如果您需要传递更多参数,您应该为其创建一个结构并在该结构中传递您的参数,但不要记住传递的结构必须保持有效,直到您的函数实际作为新线程调用。所以它应该是一个全局或动态分配的对象

于 2012-10-19T15:10:11.273 回答