pthread 通过在外部包装它来调用成员 func

pthread to invoke member func by wrapping it externally

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

#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();
}

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

改为:

private:
    pthread_t pid;

然后创建新线程:

pthread_create(&pid,NULL,&Run_wrp,this);

此外,如果您想保留 class 中包含的所有内容,您可以使 Run_wrp() 函数成为 teststatic 成员函数,只要您保留相同的签名 (return value/arguments)。它需要是 static,因为非 static 函数将指向 class 的 this 指针作为隐藏参数,因此最终得到的签名与您的签名不同需要 pthread_create().