Завершить поток в VC ++ - PullRequest
       1

Завершить поток в VC ++

2 голосов
/ 27 июня 2011

Я создал поток VC ++ с помощью функции CreateThread (), я хочу знать, как прекратить созданный поток из внешней функции.

, например

 HANDLE Handle_Of_Thread_1 = CreateThread( NULL, 0,Thread_no_1, &Data_Of_Thread_1, 0, NULL);

void Thread_no_1
{
}

Мой вопрос заключается в том, как прекратить созданный мной поток из внешней функции.

Ответы [ 3 ]

2 голосов
/ 27 июня 2011

Существует функция TerminateThread, которую вы можете использовать, но обычно она должна быть зарезервирована для критических ситуаций. Когда вы используете его, поток получает нет шансов на очистку после себя, что может легко оставить весь процесс в нестабильном состоянии.

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

1 голос
/ 27 июня 2011

Существуют различные возможности:

1) Используйте API-интерфейс TerminateThread (). Если поток не содержит блокировок других ресурсов, которые могут / потребуются другими потоками / процессами, тогда все в порядке. Обратите внимание, что этот набор потоков очень мал и его трудно точно определить - не используйте этот метод, если вы абсолютно не уверены, что он безопасен (фактически это означает «не используйте его»).

2) Если функциональность потока интенсивно использует процессор, опрашивайте логическое значение 'Abort' на каком-то подходящем уровне в вашем потоке, чтобы завершение было достаточно своевременным, но не слишком скомпрометировало его работу (т. Е. Возможно, не самый внутренний цикл) .

3) Если поток обычно блокируется на каком-либо API, попробуйте выполнить условия API «на ранних этапах», чтобы поток мог быть запущен и обнаружил логическое прерывание. Точный механизм использования зависит от конкретного API блокировки.

4) Завершить поток только при завершении работы приложения, т.е. пусть ОС делает это, когда какой-то другой поток (обычно основной поток с графическим интерфейсом) вызывает ExitProcess (). Это требует некоторых конструктивных ограничений, например. нет связи между потоками, кроме как через структуры / механизмы, которые переживают их все.

Rgds, Martin

1 голос
/ 27 июня 2011

Есть функция TerminateThread, документированная в MSDN.Однако имейте в виду, что это, как правило, плохой способ управления потоками.Из MSDN:

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

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

Обычно лучше сигнализировать поток в некоторых(например, логическая переменная bQuitRequested, которую поток иногда проверяет), запрашивающая выход из потока, а затем позволить потоку очиститься и выйти естественным образом с помощью ExitThread.Вызывающий процесс / поток может использовать WaitForSingleObject, передавая ему дескриптор потока.Блокируется до тех пор, пока поток не выйдет естественным путем или пока не истечет время ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...