Неблокирующий pthread_join
Я кодирую остановку многопоточного сервера. Если все идет так, как все нити будут выходить сами по себе, но есть небольшая вероятность того, что stream застрянет. В этом случае было бы удобно иметь неблокирующее соединение так что я мог бы это сделать.
Есть ли способ сделать неблокирующий pthread_join? Некоторое время по времени было бы неплохо.
что-то вроде этого:
- Можно ли называть pthread_exit из main?
- переменная условия - почему вызов pthread_cond_signal () перед вызовом pthread_cond_wait () является логической ошибкой?
- Убить нить в библиотеке Pthread
- Обработка сигналов в pthreads
- sem_init для OS X
foreach thread do nb_pthread_join (); если все еще работает pthread_cancel ();
Я могу подумать о большем количестве случаев, когда было бы полезно использовать неблокирующее соединение.
Как кажется, нет такой функции, поэтому я уже закодировал обходной путь, но это не так просто, как хотелось бы.
- Использование C / Pthreads: должны ли переменные переменные быть неустойчивыми?
- Функция pthread из classа
- Делает pthread_cond_wait (& cond_t, & mutex); разблокировать, а затем заблокировать мьютексы?
- Почему переменные функции состояния pthreads требуют мьютекс?
- Как вы запрашиваете pthread, чтобы узнать, все ли работает?
- Пробуждать stream заблокирован при вызове accept ()
- Вызов pthread_cond_signal без блокировки мьютекса
- Муфтезы pthread работают через streamи, если в общей памяти?
Как указывали другие, в стандартных библиотеках pthread нет неблокирующего pthread_join.
Однако, учитывая вашу заявленную проблему (пытаясь гарантировать, что все ваши streamи вышли из выключения программы), такая функция не нужна. Вы можете просто сделать это:
int killed_threads = 0; for(i = 0; i < num_threads; i++) { int return = pthread_cancel(threads[i]); if(return != ESRCH) killed_threads++; } if(killed_threads) printf("%d threads did not shutdown properly\n", killed_threads) else printf("All threads exited successfully");
Нет ничего плохого в вызове pthread_cancel для всех ваших streamов (завершено или нет), поэтому вызов для всех ваших streamов не будет блокироваться и будет гарантировать выход streamа (чистый или нет).
Это должно квалифицироваться как «простое» обходное решение.
Если вы используете приложение на Linux, вам может быть интересно узнать, что:
int pthread_tryjoin_np(pthread_t thread, void **retval); int pthread_timedjoin_np(pthread_t thread, void **retval, const struct timespec *abstime);
Будьте осторожны, так как суффиксом это говорит, «np» означает «не переносимый». Они не являются стандартом POSIX, расширениями gnu, полезными.
ссылка на страницу руководства
Механизм «pthread_join» – это удобство, которое можно использовать, если это происходит именно так, как вы хотите. Он не делает ничего, что вы не могли бы сделать сами, и где это не совсем то, что вы хотите, код именно того, что вы хотите.
Нет реальной причины, по которой вам действительно нужно, прекратил ли stream stream или нет. Что вы заботитесь о том, завершена ли работа, выполняемая streamом. Чтобы сказать это, попросите stream сделать что-то, чтобы указать, что он работает. Как вы это делаете, это зависит от того, что идеально подходит для вашей конкретной проблемы, которая во многом зависит от того, что делают streamи.
Начните с изменения своего мышления. Это не stream, который застревает, это то, что делал stream, который застревает.
Если вы разрабатываете QNX, вы можете использовать функцию pthread_timedjoin ().
В противном случае вы можете создать отдельный stream, который будет выполнять pthread_join () и предупредить родительский stream, например, сигнализируя о семафоре, что дочерний stream завершен. Этот отдельный stream может возвращать то, что получает от pthread_join (), чтобы родительский stream определял не только когда ребенок завершает, но и какое значение он возвращает.
Ответ действительно зависит от того, почему вы хотите это сделать. Например, если вы просто хотите очистить мертвые streamи, то, вероятно, проще всего использовать stream «мертвой нити», который петли и соединяется.
Я не уверен, что именно вы имеете в виду, но я предполагаю, что вам действительно нужен механизм ожидания и уведомления.
Короче говоря, вот как это работает: вы ждете условия, удовлетворяющие таймаутом. Ваше ожидание закончится, если:
- Тайм-аут происходит, или
- Если условие выполнено.
Вы можете получить это в цикле и добавить еще немного интеллекта в свою логику. Лучший ресурс, который я нашел для этого, связанный с Pthreads, – это учебное пособие: POSIX Threads Programming ( https://computing.llnl.gov/tutorials/pthreads/ ).
Я также очень удивлен, увидев, что нет API для приуроченного к Pthreads.
Существует не время pthread_join
, но если вы ожидаете, что другой stream заблокирован на условиях, вы можете использовать timed pthread_cond_timed_wait
вместо pthread_cond_wait
Вы можете нажать байт в трубу, открытую как неблокирующую, чтобы сигнализировать о другом streamе, когда это делается, а затем использовать неблокируемое чтение для проверки состояния канала.