1°C
завтра: −3°C
Погода в Перми
1°C
вечером1°C
ночью−3°C
завтра−3°C
Подробно
 64,01
−0.3311
Курс USD ЦБ РФна 18 октября
64,0144
−0.3311
 70,90
−0.1480
Курс EUR ЦБ РФна 18 октября
70,9023
−0.1480
  • Народ, если один процесс запускает процесс нить, а потом дохнет, то порожденная нить тоже дохнет или продолжает висеть.
    пишется на С++, под мастдай.

  • хех, никто не знает, или я ламер полный?

  • Вы бы молодой человек, уточнили, что вы имеете в виду.
    Что есть маздай, например. Ж-))И что есть нить - thread, pipe или еще что?

    ---
    Full http://full.nm.ru
    -------
    Оптимисты изобретают самолет, а пессимисты - парашют...

  • Когда-то делал троянчика...Так вот родительская прога запускает процесс(На дельфях thread), потом подыхает, а процесс живёт.:улыб:И по трём кнопкам не виден. Но там я чё-то хитрое делал. Уже не помню что. Но в стандартной организации такое не возможно. Так что порождённый поток подыхает. Во вспомнил. Поток который живёт называется демон. Вот и всё.

  • Какой маздай не имеет значения. Не 95-й и ладно. Thread - нить, pipe - труба, исходя из перевода.

  • Я так понимаю, подыхает он некорректным образом, т.е. именно подыхает, а не завершается?

    Да и еще то, о чем вы говорите (стандартный вариант, а не троянец с замутками) - делалось через стандартные вызовы типа _beginthread() или через объект класса TThread в Delphi?

  • Сие не есть принципиально. Согласно RTFM поток (Thread) должен прекращаться и проходить Release, когда умирает породивший его процесс
    Что опять таки противоречит тому, что тут выше было сказано, либо там использовались не потоки, а именно процессы (CreateProcess instead of CreateThread)

    А что касается маздая, то это очень даже принципиально. К примеру w9x не держат пайпы по определению.

    ---
    Full http://full.nm.ru
    -------
    Остановите Землю, я сойду...

  • В ответ на: Сие не есть принципиально...
    Убедил. Но вопрос остался: нить в этом случае завершения основного процесса подыхает, а не завершается? Я прав?

    В ответ на:А что касается маздая, то это очень даже принципиально. К примеру w9x не держат пайпы по определению.
    Может быть. Здесь не копал. Но в данном случае это не принципиально. О пайпах речь не шла.

  • Огромное спасибо!!!

  • В ответ на: Огромное спасибо!!!
    За что?

  • За что?
    так всю тему за меня раскрыл ))

  • Нить не может существовать отдельно, без процесса. Процесс остается жив, пока живет хотя бы одна его нить.

  • То есть, если я завершаю процесс, то нить тоже должна завершиться так? и как она завершается корректно или нет?

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

  • В ответ на: нить в этом случае завершения основного процесса подыхает, а не завершается? Я прав?
    У меня именно такое впечатление сложилось от хелпа. Там сказано, что прибиением созданных тобой потоков ты обязан заниматься сам, при условии что не прописано FreeOnTerninate. Я вот только с трудом могу представить себе ситуацию, когда можно убить процесс, оставив при этом в работе его потоки. OnDestroy для процесса все равно должен обрабатываться, а именно там и должны проходить финализационные освобождения.

    ---
    Full http://full.nm.ru
    -------
    От несоблюдения техники безопасности, человек может не только умереть, но и родиться.

  • Дело в том, что ты говоришь о компоненте TThread в Delphi/Builder, а я об API (_beginthread(), _endthread()). Там никаких обработок нет.

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

  • Да ни о каких сторонних библиотеках речи не идет. Я говорю о стандартных функциях: вызов в основном процессе _beginthread() порождает нить, а вызов в нити _endthread() ее завершает.

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

    VaGon, ты проболвал завершать приложение не ожидая нити? Оно хоть завершается (корректно/некорректно неважно) или продолжает висеть?

  • А я с тобой спорю что-ли? Читай внимательнее :-)
    Еще раз повторяю (уже писал про это) - если нить не завершена, то процесс останется висеть.

  • Дохнет.

  • Еще мнения будут? :)))

  • Согласно хелпу

    TerminateProcess causes all threads within a process to terminate, and causes a process to exit, but DLLs attached to the process are not notified that the process is terminating.

    Terminating a process causes the following:

    1. All of the object handles opened by the process are closed.
    2. All of the threads in the process terminate their execution.
    3. The state of the process object becomes signaled, satisfying any threads that had been waiting for the process to terminate.
    4. The states of all threads of the process become signaled, satisfying any threads that had been waiting for the threads to terminate.
    5. The termination status of the process changes from STILL_ACTIVE to the exit value of the process.

    Terminating a process does not cause child processes to be terminated.
    Terminating a process does not necessarily remove the process object from the system. A process object is deleted when the last handle to the process is closed.

    Обращаем внимание на пункт 2, и успокаиваемся

    ---
    Full http://full.nm.ru
    -------
    От смешного до великого - один шаг. Но этот шаг - до смешного велик.

  • Откуда этот кусок хелпа? Опиши как его найти. Я все же не уверен, что при этом нить завершается корректно, а не просто убивается.

  • Я думал, что нетрудно было понять, что это вырезка из хелпа к TerninateProcess (win32.hlp)

    ---
    Full http://full.nm.ru
    -------
    Отдам концы. В хорошие руки.

  • Эта функция никогда не используется для нормального завершения процесса. А только, практически, в тех ситуациях, когда процесс тебе уже не подконтролен (например, из-за подвисания нити :-). Но и в этой ситуации правильнее вызвать TerminateThread, после чего завершить процесс нормальным образом.

    В ответ на: Terminating a process does not necessarily remove the process object from the system.
    Вот об этом и речь... :-)

  • У меня хелповников к одному только билдеру стоит штук 40. Не все конечно по этой тематике, но и по ней хватает. Вот я и с просил в котором смотреть.

    К тому же я согласен с onanymous'ом по поводу его применимости. Правда TerminateThread характерен теми же свойствами:

    TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.

    TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.

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

Записей на странице:

Перейти в форум

Модератор: