pthread通过外部包装来调用成员函数

时间:2017-01-15 03:29:09

标签: class pthreads wrapper member

我试图通过使用外部包装器来调用pthread的成员函数,但它对我来说不太有效,我得到一个seg错误。为什么是这样? 这是一个显示问题的小测试程序:

#include <iostream>
#include <pthread.h>
class test {    
    public:
        test();
        ~test();
        void RunTh(void);
    private:
        pthread_t *pid;
};
void *Run_wrp(void *context);
void test::RunTh(void)
{
    while(1);
}
test::test()
{
    pthread_create(pid,NULL,&Run_wrp,this);
}
test::~test(){}

int main(void) {
    test tmp;
    std::cin.get();
}

void *Run_wrp(void *context)
{
    ((test*)context)->RunTh();
}

1 个答案:

答案 0 :(得分:1)

您的pid成员变量只是一个指针,而不是实际的pthread_t对象。

将其更改为:

private:
    pthread_t pid;

然后用:

创建新线程
pthread_create(&pid,NULL,&Run_wrp,this);

此外,如果您想保留课程中包含的所有内容,只要您保留相同的签名,就可以使Run_wrp()函数成为static成员函数test。返回值/参数)。它必须是static,因为非static函数将this指针作为隐藏参数,因此最终得到的签名不同于{{{{1}所需的签名。 1}}。