Вопрос по c, multithreading – нужно ли вызывать pthread_join ()

9

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

Ваш Ответ

6   ответов
2

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

Если вам не нужно присоединяться к обсуждению, вы можете создать его как «отделенный». нить с помощьюpthread_attr_setdetachstate на атрибуты до создания потока. Отдельные темы не могут быть объединены, но они неneed чтобы присоединиться либо.

Так,

If you want all threads to complete before the program finishes, joining from the main thread makes this work.

As an alternative, you can create the threads as detached, and return from main after all threads exit, coordinating using a semaphore or mutex+condition variable.

If you don't need all threads to complete, simply return from main. All other threads will be destroyed. You may also create the threads as detached threads, which may reduce resource consumption.

Обратите внимание, что в случае (2) ваша координация может гарантировать, что вы не выйдете до тех пор, пока потоки не сделают то, что они делают, прежде чем они отправят семафор или condvar. Это должно быть достаточно для всех практических целей, но на самом деле это не гарантирует, что вы не завершите работу до тех пор, пока не завершатся потоки, поскольку они завершаются через некоторое неопределенное время после выполнения кода, который уведомляет ваш основной поток о том, что что-то интересное имеет получилось.
0

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

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

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

21

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

Clean up any resources associated with the thread.

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

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

Спасибо за ваш ответ ... так что если я правильно понимаю ... все мои потоки будут убиты, если основные потоки завершатся ... поэтому, чтобы избежать этого, я должен либо вызвать pthread_join () или pthread_detach () ... для моего сценария, как и я не нужно main (), чтобы продолжать ждать завершения всех потоков, я просто вызову pthread_detach () и выйду из моего main (), и, наконец, ОС безопасно освободит все ресурсы, используемые всеми потоками, по их завершении ?? nav_jan
@ user1271244: нет. Если вы отсоедините потоки, они будут уничтожены при выходе из процесса, поэтому я сказал, что «если вам не нужен поток для запуска, вы также можете отсоединить его». Если вам нужно, чтобы он работал, вы должны присоединиться к нему.
1

.

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

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

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

1

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

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

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

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

-1

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

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