При завершении main потока автоматически завершается выполнение программы

Предположим, что я запускаю std::thread , а затем detach() , поэтому поток продолжает выполняться, хотя std::thread , который когда-то представлял его, выходит за рамки. Предположим далее, что программа не имеет надежного протокола для соединения выделенного потока 1 поэтому выделенный поток все еще выполняется, когда main() завершается.

Я не могу найти ничего в стандарте (точнее, в проекте N3797 С++ 14), в котором описывается, что должно произойти, ни 1.10, ни 30.3 не содержат соответствующей формулировки. 1 Еще один, возможно, эквивалентный вопрос: «может ли отсоединенный поток когда-либо соединяться снова», потому что любой протокол, который вы изобретаете, чтобы присоединиться, сигнальная часть должна быть выполнена, поток продолжал работать, и планировщик ОС мог решить, что поток будет спать в течение часа сразу после того, как сигнализация была выполнена без возможности для получающего конца надежно обнаружить, что поток фактически завершен.

Если выполнение main() с отключенными потоками выполняется undefined, то любое использование std::thread::detach() — это поведение undefined, если основной поток никогда не выходит из 2 . Таким образом, выполнение main() с работающими отдельными потоками должно иметь определенные эффекты. Возникает вопрос: где (в стандарте С++, а не POSIX, а не OS docs. ) — это те эффекты, которые определены. 2 Отделяемая нить не может быть соединена (в смысле std::thread::join() ). Вы можете дождаться результатов от отдельных потоков (например, через будущее от std::packaged_task , или с помощью семафора или флага и переменной условия), но это не гарантирует завершения потока. Действительно, если вы не поместите сигнальную часть в деструктор первого автоматического объекта потока, в общем случае будет код (деструкторы), который запускается после кода сигнализации. Если ОС расписала основной поток, чтобы потреблять результат и выйти до того, как отсоединенный поток завершит выполнение указанных деструкторов, что будет определяться?

Читайте также:
Как редактировать в программе adobe

Уроки C# – Потоки, Thread, Invoke, Action, delegate, Parallel.Invoke – C#

Marc Mutz — mmutz 02 нояб. 2013, в 17:52

Поделиться

Я могу найти только очень расплывчатую необязательную заметку в [basic.start.term] / 4: «Завершение каждого потока перед вызовом std::exit или выходом из main достаточно, но не обязательно, чтобы удовлетворить эти требования «. (весь абзац может быть релевантным) Также см. [support.start.term] / 8 ( std::exit вызывается, когда main возвращает)

dyp 02 нояб. 2013, в 17:29

Источник: overcoder.net

Java — автоматическая остановка потока при завершении программы

Обычно, когда достигается конец main , программа завершается. Но в этом примере программа напечатает «Конец основного» и затем продолжит выполнение, потому что поток все еще работает. Есть ли способ, чтобы поток мог останавливаться автоматически по достижении конца, без использования чего-то вроде while(isRunning) ?

Очередь потоков c#. Пример программы

Conner Dassen 21 Мар 2018 в 19:54

2 ответа

Лучший ответ

Создаваемый поток независим и не зависит от завершения основного потока. Для этого можно использовать поток Daemon . Потоки демона будут прерваны JVM, когда ни один из других потоков не запущен, она также включает основной поток выполнения.

Amit Bera 21 Мар 2018 в 17:02

public final void setDaemon(boolean on)

Помечает эту цепочку как поток демона или поток пользователя. Виртуальная машина Java закрывается, когда единственные запущенные потоки — это все потоки демонов . Этот метод должен быть вызывается перед запуском потока.

Источник: question-it.com

Когда в Java останавливается основной поток?

Программа завершается, когда все потоки, не являющиеся демонами, умирают (поток демона — это поток, помеченный setDaemon(true) ; обычно используется для служебных потоков). От документации:

  • Был вызван метод выхода класса Runtime, и диспетчер безопасности разрешил выполнение операции выхода.
  • Все потоки, которые не являются потоками демона, умерли либо в результате возврата из вызова к методу run, либо в результате выдачи исключения, которое распространяется за пределы метода run.

Я прочитал это утверждение: «Основной поток должен быть последним потоком, завершившим выполнение. Когда основной поток останавливается, программа завершается ». Это правда?

Нет это не так. Виртуальная машина завершает работу, если последний недемонический поток закончил. Это не обязательно должен быть основной поток.

Читайте также:
Как найти нод двух чисел программа

Должны ли две строки печати сказать «поток завершен» вместо «поток (почти) завершен»? Основной поток заканчивается, когда конец main достигается, и второй поток завершится, когда закончится run достигается. — Уаймарр

Когда основной поток останавливается, программа завершается.

Программа завершается, когда больше не работает какой-либо поток, не являющийся демоном (или кто-то с именем System.exit). Основной поток может быть давно закончен.

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

Когда вы создаете новый поток, вы можете вызвать Thread.setDaemon(true) чтобы сделать его потоком демона. Если вы сделаете это, то JVM не будет ждать завершения этого потока перед выполнением. Это полезно для любых создаваемых вами потоков, которые должны работать в фоновом режиме, пока программа не остановится.

Если вы создаете новую тему и не звоните Thread.setDaemon(true) , то JVM отложит выход до завершения этого потока, даже если основной поток завершен.

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

проверьте эту ссылку

Первое утверждение неточно. Программа Java завершается, когда все потоки, не являющиеся демонами, были завершены или когда System.exit() or Runtime.exit() вызывается.

Поток завершается, когда он выходит из своего run() метод. Основной поток особенный, потому что вы явно не реализуете его run() метод, вы реализуете main() вместо этого и main() вызывается из run() . Итак, основной поток завершается, когда main() прекращено.

Читайте также:
Кто установил программу на сервер

Но основной поток не обязательно должен быть последним.

Это из 3-го черновика спецификации JVM, так что это самый последний из известных мне:

5.7 Выход из виртуальной машины

Виртуальная машина Java прекращает все свои действия и завершает работу, если: • Все потоки, не являющиеся потоками демона, завершаются. • Некоторые потоки вызывают метод выхода класса Runtime или класса System, и операция выхода разрешена диспетчером безопасности.

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

ответ дан 16 окт ’11, 04:10

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками java multithreading jvm or задайте свой вопрос.

Источник: stackovergo.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru