Ответ на задачку №25

Spread the love

Ответ на задачку №25.
Сначала можно подумать что утверждение — не верно. Действительно:

begin
TMyThread.Create.Start;
end.

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

Однако, если вы читаете документацию (MSDN) или, например, Рихтера, то заметите, что там говорится о завершении процесса при выходе или завершении всех его потоков. Это явно противоречит ситуации выше.

В чём же дело?

Дело в том, что MSDN и Рихтер говорят о ситуации в «голой» системе, но мы рассматриваем случай, когда поверх системы накладывается ещё код поддержки языка — RTL. Система, действительно, не делает различий между главным и фоновыми потоками и закроет процесс только тогда, когда завершится каждый из потоков — вне зависимости от того, главный он или нет.

Но для RTL разница есть — главный поток выделяется особо. В частности, RTL с помощью «магии компилятора» вставляет скрытый вызов Halt(0) сразу после выполнения главного блока программы (т.е. в строке «end.»). Вот и получается, что при нормальном выходе программы вызывается Halt(0), который, в свою очередь, вызывает ExitProcess, которая завершает все потоки и, следовательно, процесс.

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

Читать на сайте автора.

0 ответы

Ответить

Хотите присоединиться к обсуждению?
Не стесняйтесь вносить свой вклад!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *