在使用pthread_create创建的线程中读取和写入管道时,是否需要关闭fds?

时间:2015-02-17 10:17:13

标签: c++ c multithreading unix pipe

我正在处理一个客户端服务器应用程序。以下是客户端的代码。

pipe_inputpipe_output是共享变量。

        int fds[2];
            if (pipe(fds)) {
                        printf("pipe creation failed");
                    }  else {
                        pipe_input = fds[0];
                        pipe_output = fds[1];
                        reader_thread_created = true;
                        r = pthread_create(&reader_thread_id,0,reader_thread,this);
                        }


 void* reader_thread(void *input)
    {
    unsigned char id;
        int n;
        while (1) {

            n = read(pipe_input , &id, 1);
            if (1 == n) {
                //process
            }if ((n < 0) ) {
                printf("ERROR: read from pipe failed");
                break;
            }
        }
        printf("reader thread stop");
        return 0;
    }

还有一个编写器线程,用于从服务器写入有关事件更改的数据。

void notify_client_on_event_change(char id)
{
    int n;
    n= write(pipe_output, &id, 1);
    printf("message written to pipe done ");
}

我的问题是我需要在读者线程中关闭写端,并在编写线程的情况下读取结束。在析构函数中,我正在等待读取器线程退出,但有时它不会退出读取器线程。

1 个答案:

答案 0 :(得分:3)

  

[...]我是否需要关闭读取器线程中的写入结束并在写入线程的情况下读取结束[?]

当那些fds“被共享”时,在一个线程中关闭它们会为所有线程关闭它们。我怀疑那不是你想要的。