необходимо ли вызывать pthread join()

Я создаю более 100 потоков из моего main (), поэтому я просто хотел знать, что мне нужно вызвать pthread_join () перед выходом из main (). Также мне не нужны данные, генерируемые этими потоками, в основном все потоки выполняют некоторую работу независимо от main() и других потоков.

6 ответов


pthread_join делает две вещи:

  1. дождитесь завершения потока.
  2. очистите все ресурсы, связанные с потоком.

Если вы выйдете из процесса без присоединения, то (2) будет сделано для вас ОС (хотя это не будет делать очистку отмены потока, просто сбросьте поток с орбиты), и (1) не будет. Так ли вам нужно позвонить pthread_join зависит от того, нужно ли вам (1) произойдет.

Если вам не нужен поток беги, а потом, как все говорят, можешь его отстегнуть. Отсоединенный поток не может быть присоединен (поэтому вы не можете ждать его завершения), но его ресурсы освобождаются автоматически, если он завершается.


при выходе вам не нужно присоединяться, потому что все остальные потоки и ресурсы будут автоматически очищены. Это предполагает, что вы действительно хотите, чтобы все потоки были убиты, когда main выход.

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

и

  1. Если вы хотите, чтобы все потоки завершились до завершения программы, присоединение к основному потоку делает эту работу.

  2. в качестве альтернативы, вы можете создать потоки, как отдельно стоящий, так и вернуться из main после выхода всех потоков, координируя использование семафора или переменной условия мьютекса+.

  3. Если вам не нужны все потоки для завершения, просто вернитесь из main. Все остальные темы будут уничтожены. Вы также можете создать потоки как отдельные потоки, что может уменьшить потребление ресурсов.


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

поскольку из вашего описания никто, кроме самого потока, не нуждается в ресурсах потока, поэтому вы можете создать поток отсоединенным или отсоединить поток до его запуска.

чтобы отсоединить поток после его создания, вызовите pthread_detach().

в любом случае, если вы хотите убедиться, что все потоки исчезли до завершения программы, вы должны запустить потоки прикрепляются и присоединяются к ним перед выходом из основного потока (программы).


по умолчанию потоки в библиотеке pthreads создаются как присоединяемые.

потоки могут, однако, отсоединяться, делая их более не присоединяемыми. Поскольку потоки потребляют системные ресурсы до объединения, так же как процессы потребляют ресурсы до родительских вызовов wait (), потоки, к которым вы не собираетесь присоединяться, должны быть отделены, что является хорошей практикой программирования.

конечно, как только основные рутинные выходы, все потоковые ресурсы освобождаются.

Если мы не сумеем сделайте это (отсоединение), затем, когда поток завершается, он производит поток, эквивалентный процессу зомби. Помимо траты системных ресурсов, если накопится достаточно потоков зомби, мы не сможем создать дополнительные потоки.


Если вы хотите быть уверены, что ваш поток фактически завершен, вы хотите позвонить pthread_join.

Если вы этого не сделаете, то завершение вашей программы резко завершит весь незавершенный поток.

что сказал, ваш main может ждать достаточно долго, пока он не выйдет. Но тогда, как вы можете быть уверены, что это suffucient?


Если ваша главная концы концы приложения и темы умирают... Поэтому вам нужно использовать thread join (или использовать fork вместо этого).