在C 中的PTHreads中传递具有参数的成员函数



我正在将类成员函数传递给pthread_create并低于错误。我知道stackoverflow上已经有很多查询,他们说的是在pthread_create中的pthread和函数回调中围绕类成员函数做一个静态助手,并通过pthread_create中的最后一个参数传递该静态函数,但是在我的情况下,成员函数具有参数还。因此,我的问题略有不同。我应该在哪里通过成员函数参数?

#include <stdio.h>
#include <pthread.h>
struct Point
{
  int y;
  int z;
};
class A
{
  int x;
  public:
    int getX();
    void setX(int val) {x = val;}
    void* func(void* args) 
    {
      Point p = *(Point *)args;
      int y = p.y;
      int z = p.z;
      return (void *)(x + y + z); 
    }

    void myFunc()
    {
      int y = 12;
      int z = 2;
      pthread_t tid;
      Point p;
      p.y = y;
      p.z = z;
      pthread_create(&tid, NULL, func, &p);
      pthread_join(tid, NULL);
    }
};
int main(int argc, char *argv[])
{
  A a;
  a.myFunc();
  return 0;
}

错误:

 classThreads.c: In member function ‘void A::myFunc()’:
classThreads.c:40:42: error: cannot convert ‘A::func’ from type ‘void* (A::)(void*)’ to type ‘void* (*)(void*)’
       pthread_create(&tid, NULL, func, &p);

问题是您没有将this指针传递给线程创建方法。这需要添加到参数列表中。

#include <utility>
#include <pthread.h>
struct Point
{
  int y;
  int z;
};
class A
{
  int x;
  public:
    int getX();
    void setX(int val) {x = val;}
    static void* func(void* args) 
    {
      std::pair< A*, Point > tp = *(std::pair< A*, Point > *)args;
      int y = tp.second.y;
      int z = tp.second.z;
      return (void *)(tp.first->x + y + z); 
    }

    void myFunc()
    {
      int y = 12;
      int z = 2;
      pthread_t tid;
      Point p;
      p.y = y;
      p.z = z;
      std::pair< A*, Point > tp( this, p );
      pthread_create(&tid, NULL, func, &tp);
      pthread_join(tid, NULL);
    }
};
int main(int argc, char *argv[])
{
  A a;
  a.myFunc();
  return 0;
}

您可以使用std::tuple类通过this指针和多个参数。

最新更新