Необходимо вызвать pthread_join()

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

Ответ 1

pthread_join выполняет две вещи:

  • Дождитесь окончания потока.
  • Очистите все ресурсы, связанные с потоком.

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

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

Ответ 2

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

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

Итак,

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

Да, если поток является присоединяемым, тогда pthread_join должен, в противном случае он создает поток Zombie.

Согласитесь с ответами выше, просто поделитесь заметкой со страницы руководства pthread_join.

ЗАМЕТКИ

   After a successful call to pthread_join(), the caller is guaranteed that the target thread has terminated.

   Joining with a thread that has previously been joined results in undefined behavior.

   Failure to join with a thread that is joinable (i.e., one that is not detached), produces a "zombie thread".  Avoid doing this, since each zombie thread consumes some  system  resources,  and  when
   enough zombie threads have accumulated, it will no longer be possible to create new threads (or processes).

Ответ 7

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