使用pthread在64位Ubuntu中从void *转换为int

时间:2013-11-09 00:28:45

标签: c++ pthreads pipe void-pointers

我的问题是我需要运行一个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”是一个解决方法,我发现编译它没有错误。

感谢您的时间,对我的英语感到抱歉,这不是我的母语,所以你指出任何语法错误,它都很好。

1 个答案:

答案 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);