Мобильная версия форумов
Открыть
 −4°C
завтра: −2°C
Погода в Перми
−4°C
ночью−4°C
утром−4°C
завтра−2°C
Подробно
 65,86
−0.3454
Курс USD ЦБ РФна 21 февраля
65,8568
−0.3454
 74,68
−0.1335
Курс EUR ЦБ РФна 21 февраля
74,6816
−0.1335
  • #VaGon#

    Анонимный пользователь

    Народ, если один процесс запускает процесс нить, а потом дохнет, то порожденная нить тоже дохнет или продолжает висеть.
    пишется на С++, под мастдай.

  • #VaGon#

    Анонимный пользователь

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

  • veteran

    Сообщений: 2421

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

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

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

  • Cactus

    Анонимный пользователь

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

  • Cactus

    Анонимный пользователь

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

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

  • veteran

    Сообщений: 2421

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

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

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

  • Cactus

    Анонимный пользователь

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

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

  • #VaGon#

    Анонимный пользователь

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

  • Cactus

    Анонимный пользователь

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

  • #VaGon#

    Анонимный пользователь

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

  • guru

    Сообщений: 3019

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

  • #VaGon#

    Анонимный пользователь

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

  • guru

    Сообщений: 3019

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

  • veteran

    Сообщений: 2421

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

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

  • Cactus

    Анонимный пользователь

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

  • guru

    Сообщений: 3019

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

  • Cactus

    Анонимный пользователь

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

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

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

  • guru

    Сообщений: 3019

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

  • Анонимный пользователь
    Дохнет.

  • Cactus

    Анонимный пользователь

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

  • veteran

    Сообщений: 2421

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

    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
    -------
    От смешного до великого - один шаг. Но этот шаг - до смешного велик.

  • Cactus

    Анонимный пользователь

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

  • veteran

    Сообщений: 2421

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

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

  • guru

    Сообщений: 3019

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

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

  • Cactus

    Анонимный пользователь

    У меня хелповников к одному только билдеру стоит штук 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.

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

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

Модератор: