2014-09-29 4 views
0

Используя только стандартный C++ (API не специфичный для платформы), я хотел бы запустить внешнее приложение, которое может завершиться немедленно или таймаутом. Если приложение приостанавливается, у моего приложения есть тайм-аут, после которого он просто завершает работу приложения и возобновляет его.Завершить один поток (который застрял) от другого

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

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

Вопрос в том, как я могу завершить первый поток со второго? Способ запуска приложения - использовать функцию system(). Это синхронно, поэтому мне не нужно проверять этот поток, если я желаю прекращения. Его нужно каким-то образом изгнать из-за исключения извне.

Как это делается P.S правильно? 7

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

+0

Я был бы удивлен, если бы был переносной способ убить процесс, запущенный с помощью 'system()'. – NPE

+0

Я не хочу убивать процесс. Просто поток, который запустил его. Это нормально для меня, потому что этот процесс редко останавливается. Поэтому в конце дня у меня было бы несколько процессов, но это не проблема. –

+1

В явном абзаце явным образом просил указать способ завершения дочернего процесса. Что касается убийства потока, какую библиотеку потоков вы используете? C++ 11 'std :: thread' или что-то еще? – Useless

ответ

1

Вы не можете принудительно завершить другой поток. Вы можете вежливо попросить его выйти. Это выполняется в моделях потоков C++ и POSIX. Windows имеет TerminateThread, но это настолько опасно, что практически непригодно. POSIX имеет pthread_cancel. Это кооператив прекращение, которое может соответствовать вашему счету, но нет стандартного эквивалента C++.

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

Чтобы нить бесплатна, не несет ответственности за join, используйте thread::detach().

+1

сторона примечания к ответу: если мы хотим относительно безопасно ** прекратить ** работу, которая пошла дико и т. Е.упал в бесконечный цикл или бесконечное ожидание и не отвечает на любые вежливые запросы, единственным вариантом является выполнение этого задания ** в отдельном процессе **. В этом отдельном процессе мы сможем приостанавливать, возобновлять, отдавать приоритет, как поток, а также - мы сможем ** убить ** без каких-либо рисков для вашего основного процесса. Конечно, IPC намного медленнее, чем разговор с потоком. – quetzalcoatl

+0

@quetzalcoatl true, но OP заинтересован в стандартном решении на C++. –

+0

Да, вот почему это просто комментарий, ОП попросил прекратить работу/потоки, вы сказали, что это большой нет-нет, я бросил заметку о том, как это можно сделать безопасно .. может быть, это поможет кому-то еще если OP игнорирует это. – quetzalcoatl

Смежные вопросы