将C ++函数对象传递给pthread_create函数作为线程例程

时间:2014-10-17 06:35:13

标签: c++ multithreading pthreads functor

我知道传递给pthread_create API的线程例程具有

的原型
void *threadproc(void *).

我只是想知道是否可以使用C ++函数对象作为线程例程。

这是我的代码:

执行::运行方法将 time_t 变量和仿函数作为参数。它产生一个POSIX线程,在该线程中它旋转直到预定的运行时间是最新的并运行一些工作。

#include <pthread.h>
#include <ctime>
#include <unistd.h>
#include <iostream>
using namespace std;

class ThreadFunctor
{
public:
  void *operator()(time_t runTime)
  {
      time_t curTime;
      double timeDiff;

      time(&curTime);
      timeDiff = difftime(runTime, curTime);

      if (timeDiff > 0)
      {
          sleep(timeDiff);
      }

      //
      // doSomething();
      //

      return NULL;
  }
};

class Execution
{
public:
  Execution() {}
  int run(time_t scheduledTime, ThreadFunctor &threadProc)
  {
      int rc = pthread_create(&mThread, NULL, threadProc, &scheduledTime);
      if (rc != 0)
      {
          cerr << "Thread creation failed\n";
          return -1;
      }
      return 0;
  }

private:
  pthread_t mThread;
};

问题:

  1. 我可以使用函数对象作为线程函数吗?怎么样?

  2. 如何将参数传递给函数对象的operator()方法?

  3. 在此代码中,父进程在子线程仍在运行时终止。因为我们不想阻止run()方法的调用者。这是一个好习惯吗?孤儿线程会在这里引起问题吗?

  4. 感谢。

1 个答案:

答案 0 :(得分:3)

pthread函数必须具有C链接,因此它不能是成员函数。严格来说,它甚至不能成为静态成员函数,即使它几乎一直都可以工作。

所以应该做的是创建一个非成员函数,它接受一个void*参数,该参数将是一个指向C ++对象的指针作为线程函数。该函数可以将void*参数转换为类指针,该类指针调用成员函数。

请参阅In C++, is it safe/portable to use static member function pointer for C API callbacks?