Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Поскольку другие указали, там не неблокирование pthread_join доступный в стандарте pthread библиотеки.
Однако, учитывая Вашу установленную проблему (пытающийся гарантировать, что все Ваши потоки вышли на завершении работы программы) такая функция не нужна. Можно просто сделать это:
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 на всех Ваших потоках (завершено или не) настолько звонящий, который для всех Ваших потоков не заблокирует и гарантирует выход потока (чистый или не).
, Который должен квалифицировать как 'простое' обходное решение.
Если Вы разрабатываете для QNX, можно использовать pthread_timedjoin () функция.
Иначе, можно создать отдельный поток, который выполнит pthread_join () и предупредит родительский поток путем передачи сигналов о семафоре, например, что дочерний поток завершается. Этот отдельный поток может возвратить то, что, добирается от pthread_join (), чтобы позволить родительскому потоку определить, не только когда ребенок завершается, но также и что оценивает его возвраты.
Ответ действительно зависит от того, почему Вы хотите сделать это. Если Вы просто хотите очистить мертвые потоки, например, является, вероятно, самым легким только иметь "мертвый инструмент для очистки потока", распараллеливают это циклы и соединения.
Я не уверен, что точно Вы имеете в виду, но я предполагаю, что то, в чем Вы действительно нуждаетесь, является ожиданием, и уведомьте механизм.
Короче говоря, вот то, как это работает: Вы ожидаете условия удовлетворить тайм-аутом. Ваше ожидание будет закончено если:
Вы можете иметь это в цикле и добавить еще некоторую аналитику к Вашей логике. Лучший ресурс, который я нашел для связанный с Pthreads, является этим учебным руководством: Программирование Потоков POSIX ( https://computing.llnl.gov/tutorials/pthreads / ).
я также очень удивлен видеть, что нет никакого API для синхронизированного, участвуют в Pthreads.
Нет никакого синхронизированного pthread_join
, но если Вы ожидаете другого потока, заблокированного на условиях, можно использовать синхронизированный pthread_cond_timed_wait
вместо pthread_cond_wait
Вы могли продвинуть байт в канал, открытый как не блокирующийся сигнализировать к другому потоку когда его сделанный, затем использовать чтение неблокирования для проверки состояния канала.
Если вы запускаете свое приложение в 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, но полезны.