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()
函数成为 test
的 static
成员函数,只要您保留相同的签名 (return value/arguments)。它需要是 static
,因为非 static
函数将指向 class 的 this
指针作为隐藏参数,因此最终得到的签名与您的签名不同需要 pthread_create()
.
我正在尝试使用外部包装器通过 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()
函数成为 test
的 static
成员函数,只要您保留相同的签名 (return value/arguments)。它需要是 static
,因为非 static
函数将指向 class 的 this
指针作为隐藏参数,因此最终得到的签名与您的签名不同需要 pthread_create()
.