我试图通过使用外部包装器来调用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();
}
答案 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}}。