У меня есть приложение, которое создает std :: thread для запуска длинного l oop. Он получает std :: future, поэтому его можно прервать.
Поток выглядит примерно так:
void MyThreadObject::myThread(std::future<void> *abort)
{
for(size_t i=0; i<100000; i++)
{
doStuff();
// for aborting
if(abort->wait_for(std::chrono::milliseconds(1)) != std::future_status::timeout)
{
return;
}
}
}
Прерывание выглядит так:
void MyThreadObject::stopThread()
{
m_abort_signal.set_value(); // type std::promise<void>
//Wait for thread to join
m_thread->join(); // type is std::thread
delete m_thread;
m_thread = nullptr;
doOtherStuffWhenThreadIsFinished();
}
Теперь, когда я запускаю и останавливаю поток, все работает нормально.
Но есть также приведение (что в большинстве случаев), что поток завершился, потому что l oop достиг своего конечного значения, и пользователь не прервал его. В этом случае stopThread () никогда не вызывается.
Моя проблема в том, что в этом случае мне где-то нужно вызвать join (), а также doOtherStuffWhenThreadIsFinished (); Но откуда?