如何将派生类函数作为线程的启动例程?

时间:2012-10-23 06:42:04

标签: c++ oop c++11 pthreads

您好我有以下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);                        

2 个答案:

答案 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();

}