我的问题是我需要运行一个pthread,所以我可以听一个管道,事情是我有一个结构中的管道:
struct Pipefd {
int tuberia1[2];
int tuberia2[2];
};
这是我创建pthread的方式:
intptr_t prueba = pf.tuberia2[0];
pthread_create(NULL,NULL, listenProcess,reinterpret_cast<void*>(prueba));
这是我调用的方法:
void *listenProcess(void* x){
int a = reinterpret_cast<intptr_t>(x);
close(0);
dup(a);
string word;
while(getline(cin,word)){
cout << "Termino y llego: " << word << endl;
}
}
它编译,但我得到一个分段错误,但我不明白。 im newby in c ++,我已经搜索了很多,并没有找到工作的答案,“reinterpret_cast”是一个解决方法,我发现编译它没有错误。
感谢您的时间,对我的英语感到抱歉,这不是我的母语,所以你指出任何语法错误,它都很好。
答案 0 :(得分:2)
POSIX线程API允许您在首次调用线程函数时为用户数据传递通用void*
。
由于您已经定义了以下结构:
struct Pipefd {
int tuberia1[2];
int tuberia2[2];
};
您可能希望将指针传递给实际结构,而不是将此结构的单个字段强制转换为void*
:
void* ppf = reinterpret_cast<void *>(&pf);
pthread_create(NULL,NULL, listenProcess,ppf);
现在,您修改后的线程函数将如下所示:
void *listenProcess(void* x){
Pipefd* ppf = reinterpret_cast<Pipefd *>(x);
close(0);
dup(ppf->tuberia2 [0]);
string word;
while(getline(cin,word)){
cout << "Termino y llego: " << word << endl;
}
}
您对pthread_create (...)
的呼叫也无效,您必须将指针传递给pthread_t
变量。这应该可以解决因调用pthread_create (...)
而导致的细分错误:
void* ppf = reinterpret_cast<void *>(&pf);
pthread_t tid;
pthread_create(&tid,NULL, listenProcess,ppf);