我知道传递给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;
};
问题:
我可以使用函数对象作为线程函数吗?怎么样?
如何将参数传递给函数对象的operator()方法?
在此代码中,父进程在子线程仍在运行时终止。因为我们不想阻止run()方法的调用者。这是一个好习惯吗?孤儿线程会在这里引起问题吗?
感谢。
答案 0 :(得分:3)
pthread函数必须具有C链接,因此它不能是成员函数。严格来说,它甚至不能成为静态成员函数,即使它几乎一直都可以工作。
所以应该做的是创建一个非成员函数,它接受一个void*
参数,该参数将是一个指向C ++对象的指针作为线程函数。该函数可以将void*
参数转换为类指针,该类指针调用成员函数。
请参阅In C++, is it safe/portable to use static member function pointer for C API callbacks?