0

嗨,我有以下 C++ 代码,

我在 thread.h 文件中有 MyThread 类

class MyThread
{ 
    public:
       void start();
       virtual void* task() = 0;
};

我在worker.h文件中有工人阶级

class Worker : public MyThread
{
    virtual ~Worker();
    virtual void* task();   // I have implementation in worker.cpp
};

pthread_create()start()inthread.cpp文件中用于创建线程,我想将task()w 中定义的例程orker.cpp作为启动例程。那么我该怎么做呢?我应该将什么作为参数传递给启动例程pthread_create

我已经尝试过了,但它给出了一个错误:

pthread_create(&(this->threadId),&(this->attr),(void *)task,NULL);                        
4

2 回答 2

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);
}
于 2012-10-23T06:55:14.947 回答
0

您不能使用 task() 作为线程的启动例程,因为它是成员函数而不是自由函数,就像预期的签名 void *(*start_routine)(void*)。(另外,它没有指向 void 参数的指针)

我只想创建一个包装器并将其作为启动例程,如下所示:

void *wrapper(void *data)
{
    Worker worker;
    worker.task();

}
于 2012-10-23T06:53:55.807 回答