Нужно ли закрывать fds при чтении и записи в канал между потоками, созданными с помощью pthread_create?

0

Существует приложение клиентского сервера, над которым я работаю. Ниже приведен код с клиентской стороны.

pipe_input, pipe_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 ");
}

Мой вопрос: мне нужно закрыть конец записи в потоке чтения и прочитать конец в случае потока записи. В деструкторе я жду выхода читателя, но иногда он не выходит из потока читателей.

  • 0
    Пожалуйста, будьте хороши и правильно сделайте отступ в своем коде.
Теги:
multithreading
pipe

1 ответ

3
Лучший ответ

[...] мне нужно закрыть конец записи в потоке чтения и прочитать конец в случае потока записи [?]

Поскольку эти fds "разделяются", закрытие их одним потоком закрывает их для всех потоков. Подозреваю, это не то, чего вы хотите.

  • 0
    спасибо алк за ответ. Можете ли вы сказать мне, что если чтение заблокировано на fd, и я сделал fd = -1 из другого потока в то же время, будет читать возврат с -1 или будет заблокирован навсегда.
  • 0
    @ Эйлер: Нет, не будет, так как при вызове read() read() получил копию значения fd. C это передать по значению. Также это другой вопрос, и вы могли бы поставить его в таком виде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню