Boost Thread - Как подтвердить прерывание
У меня есть задача блокировки, которая будет выполняться функцией find_the_question(). Тем не менее, я не хочу, чтобы поток, выполняющий эту функцию, занимал более 10 секунд. Поэтому, если это занимает больше 10 секунд, я хочу закрыть эту тему, очистив все ресурсы.
Я попытался написать код для этого, но каким-то образом я не могу получить прерывание в функции find_the_question(), если поток занимает более 10 секунд. Не могли бы вы рассказать мне, что я делаю неправильно?
void find_the_question(std::string value)
{
//allocate x resources
try{
//do some process on resources
sleep(14);
//clean resources
}
catch(boost::thread_interrupted const& )
{
//clean resources
std::cout << "Worker thread interrupted" << std::endl;
}
}
int main()
{
boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000);
std::cout << "In main" << std::endl;
boost::thread t1(find_the_question, "Can you block me");
t1.interrupt();
if (t1.timed_join(timeout))
{
//finished
std::cout << "Worker thread finished" << std::endl;
}
else
{
//Not finished;
std::cout << "Worker thread not finished" << std::endl;
}
std::cout << "In main end" << std::endl;
}
Вывод:
Если t1 занимает больше 10 секунд, я получаю следующий вывод консоли.
std::cout << "In main" << std::endl;
std::cout << "Worker thread not finished" << std::endl;
std::cout << "In main end" << std::endl;
тогда как я ожидаю следующий вывод
std::cout << "In main" << std::endl;
std::cout << "Worker thread interrupted" << std::endl;
std::cout << "Worker thread not finished" << std::endl;
std::cout << "In main end" << std::endl;
Не могли бы вы рассказать мне, что я делаю неправильно.
Заранее спасибо
Ответы
Ответ 1
Для использования boost:: thread:: interrupt() вам нужно использовать boost:: thread:: sleep(), чтобы он работал.
Выполняемый поток может быть прерван путем вызова элемента interrupt() функции соответствующего объекта boost:: thread. Когда прерванный поток следующий выполняет одно из указанных прерываний (или если он в настоящий момент заблокирован во время выполнения) с помощью прерывание включено, то исключение boost:: thread_interrupted будет быть брошенным в прерванную нить. Если не поймать, это вызовет выполнение прерывистой нити для завершения. Как и с любым другое исключение, стек будет размотан, а деструкторы для будут выполняться объекты времени автоматического хранения
Предопределенные точки прерывания:
Следующие функции являются точками прерывания, которые будут бросать boost:: thread_interrupted, если прерывание включено для текущего поток и прерывание запрашиваются для текущего потока:
boost::thread::join()
boost::thread::timed_join()
boost::condition_variable::wait()
boost::condition_variable::timed_wait()
boost::condition_variable_any::wait()
boost::condition_variable_any::timed_wait()
boost::thread::sleep()
boost::this_thread::sleep()
boost::this_thread::interruption_point()