0

我的问题是我需要运行一个 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;

    }
}

它编译,但我得到一个分段错误,但我不明白。我是 C++ 的新手,我已经搜索了很多但没有找到工作的答案,“reinterpret_cast”是我发现编译它没有错误的一种解决方法。

感谢您的宝贵时间,对不起我的英语,它不是我的母语,所以您指出的任何语法错误,都很好。

4

1 回答 1

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);
于 2013-11-09T01:48:16.917 回答