Автоматически? присоединиться к std :: thread по завершении задачи - PullRequest
0 голосов
/ 27 мая 2020

У меня есть приложение, которое создает 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 (); Но откуда?

...