您好我有以下C ++代码,
我在thread.h文件中有MyThread类
class MyThread
{
public:
void start();
virtual void* task() = 0;
};
我在worker.h文件中有worker类
class Worker : public MyThread
{
virtual ~Worker();
virtual void* task(); // I have implementation in worker.cpp
};
在pthread_create()
start()
文件中使用thread.cpp
创建了一个帖子,我希望将w task()
中定义的orker.cpp
例程设为启动程序。那我该怎么办呢?我应该将什么作为参数传递给pthread_create
中的启动例程?
我试过这个,但它给出了一个错误:
pthread_create(&(this->threadId),&(this->attr),(void *)task,NULL);
答案 0 :(得分:2)
您不能将成员函数用作线程函数。你只能使用自由函数或静态成员函数,但你可以将任意void *参数传递给该函数,你可以将指针传递给this
作为该参数,允许你调用成员函数内的函数:
class MyThread
{
public:
void start();
virtual void* task() = 0;
static void * thread_routine(void* pthis)
{
MyThread* t = static_cast<MyThread*>(pthis);
t->task();
return 0;
}
};
然后你就像这样启动你的线程
void MyThread::start()
{
pthread_create(&(this->threadId),&(this->attr),thread_routine, this);
}
答案 1 :(得分:0)
您不能将task()用作线程的启动例程,因为它是成员函数而不是自由函数,如预期的签名void *(* start_routine)(void *)。 (另外,它没有指向void参数的指针)
我只想创建一个包装器并将其作为启动例程,如下所示:
void *wrapper(void *data)
{
Worker worker;
worker.task();
}