Существует приложение клиентского сервера, над которым я работаю. Ниже приведен код с клиентской стороны.
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 ");
}
Мой вопрос: мне нужно закрыть конец записи в потоке чтения и прочитать конец в случае потока записи. В деструкторе я жду выхода читателя, но иногда он не выходит из потока читателей.
[...] мне нужно закрыть конец записи в потоке чтения и прочитать конец в случае потока записи [?]
Поскольку эти fds "разделяются", закрытие их одним потоком закрывает их для всех потоков. Подозреваю, это не то, чего вы хотите.
read()
read()
получил копию значения fd. C это передать по значению. Также это другой вопрос, и вы могли бы поставить его в таком виде.