为什么我不能通过传入的类对象参数杀死pthread

时间:2019-06-10 22:04:12

标签: c++ linux pthreads

我启动一个后台线程来运行我的类函数,该任务作为无限循环执行,直到客户端决定停止为止。因此,由于在创建pthread时将类对象“ this”传递到线程中,因此我尝试将其强制转换为类对象但得到一个空对象,有人可以向我解释为什么这不可行吗?

   void Camera::init()
   {
      typedef void *(*ThreadFuncPtr)(void *);
      this->quit=false;
      pthread_create(&acq, NULL, (ThreadFuncPtr)(&Camera::_acquireImages), this);
   }

   void Camera::stopAcquire()
   {
       this->quit=true;
   }

   void Camera::_acquireImages(void* ptr)
   {
       auto obj = (Camera*) ptr;  //obj after cast shows as NULL object
       while(!obj->quit){
       //do something
       }
       pthread_exit(NULL);
   }

1 个答案:

答案 0 :(得分:4)

  

因此,由于在创建pthread时将类对象“ this”传递到   线程

pthread_createC函数,并且期望函数签名为void* (*)(void*),但是现在它具有签名void (Camera::*)(void*),因此存在两个错误:函数应返回{ {1}},它也是非静态的类成员。要对其进行修复,请使函数返回void*并使其void*

static

如果您使用的是C ++ 11(或更高版本),则应查看使生活更加轻松的标准void Camera::init() { this->quit = false; // now that the function has the correct signature, you don't need // to cast it (into something that it wasn't) pthread_create(&acq, NULL, &Camera::acquireImages, this); } void Camera::stopAcquire() { this->quit = true; } /*static*/ void* Camera::acquiredImages(void* ptr) // make it static in the declaration { Camera& obj = *static_cast<Camera*>(ptr); while(obj.quit == false){ //do something } return nullptr; }

<thread>