Неблокирование pthread_join

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

21
задан pseudosavant 2 June 2015 в 19:02
поделиться

7 ответов

Поскольку другие указали, там не неблокирование 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 на всех Ваших потоках (завершено или не) настолько звонящий, который для всех Ваших потоков не заблокирует и гарантирует выход потока (чистый или не).

, Который должен квалифицировать как 'простое' обходное решение.

1
ответ дан 29 November 2019 в 20:43
поделиться

Если Вы разрабатываете для QNX, можно использовать pthread_timedjoin () функция.

Иначе, можно создать отдельный поток, который выполнит pthread_join () и предупредит родительский поток путем передачи сигналов о семафоре, например, что дочерний поток завершается. Этот отдельный поток может возвратить то, что, добирается от pthread_join (), чтобы позволить родительскому потоку определить, не только когда ребенок завершается, но также и что оценивает его возвраты.

3
ответ дан 29 November 2019 в 20:43
поделиться

Ответ действительно зависит от того, почему Вы хотите сделать это. Если Вы просто хотите очистить мертвые потоки, например, является, вероятно, самым легким только иметь "мертвый инструмент для очистки потока", распараллеливают это циклы и соединения.

1
ответ дан 29 November 2019 в 20:43
поделиться

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

Короче говоря, вот то, как это работает: Вы ожидаете условия удовлетворить тайм-аутом. Ваше ожидание будет закончено если:

  • тайм-аут происходит, или
  • , Если условие удовлетворено.

Вы можете иметь это в цикле и добавить еще некоторую аналитику к Вашей логике. Лучший ресурс, который я нашел для связанный с Pthreads, является этим учебным руководством: Программирование Потоков POSIX ( https://computing.llnl.gov/tutorials/pthreads / ).

я также очень удивлен видеть, что нет никакого API для синхронизированного, участвуют в Pthreads.

1
ответ дан 29 November 2019 в 20:43
поделиться

Нет никакого синхронизированного pthread_join, но если Вы ожидаете другого потока, заблокированного на условиях, можно использовать синхронизированный pthread_cond_timed_wait вместо pthread_cond_wait

1
ответ дан 29 November 2019 в 20:43
поделиться

Вы могли продвинуть байт в канал, открытый как не блокирующийся сигнализировать к другому потоку когда его сделанный, затем использовать чтение неблокирования для проверки состояния канала.

0
ответ дан 29 November 2019 в 20:43
поделиться

Если вы запускаете свое приложение в 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, но полезны.

ссылка на страницу руководства

22
ответ дан 29 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: