Member 13622714 Ответов: 2

Как завершить поток в другом потоке


Я создал поток с помощью std::thread в C++.

std::thread thread_variable(function_name);


С помощью приведенного выше кода он создаст поток.
И мне нужно завершить этот поток, используя thread_variable в другом потоке, например TerminateThread() win32 api.

Как это можно сделать?
Спасибо

Что я уже пробовал:

Я пытался использовать дескриптор std::thread, но thread работает хорошо.
Спасибо

Afzaal Ahmad Zeeshan

Чтобы передать команду от одного потока к другому, вам нужно будет "сигнализировать" потоку, а затем выполнить действие. В большинстве простых способов это можно сделать с помощью переменной, которая уведомляет ThreadXYZ о завершении. Поток будет выполняться только один раз. В этом сценарии, скорее всего, поток находится в цикле while, который препятствует завершению потока.

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

2 Ответов

Рейтинг:
6

KarstenK

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

псевдокод:

bool stopThread = false;

void threadOne()
{
  if( timeToLeave ) {
    stopThread = true;
  }
}

void threadTwo()
{
  while( !stopThread ) {
    //do silly stuff, maybe some waiting
  }
}
Если вам это не нравится прочтите документации и "может быть" вы можете делать такие вещи, как это
std::thread *myThread = new std::thread(...);//some working constructor
delete myThread;
Желаю Вам удачи...


OmidXavaX

этот код не работает на релизе , это педагогическая демонстрация

Рейтинг:
2

CPallini

Не ставьте снова и снова один и тот же вопрос. Там нет никакого способа в стандарте C++ делать то, что ты хочешь. Рик-Йорке опубликованный здесь[^] обычный способ выполнения задачи.
Альтернативой является использование лежащего в основе API вашей операционной системы с помощью нити native_handle.

Смотрите, например c++ - Как остановить запуск потока std::без завершения работы программы - переполнение стека[^].