Boost Thread - Как подтвердить прерывание - PullRequest
17 голосов
/ 06 сентября 2011

У меня есть задача блокировки, которая будет выполняться функцией 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 Ответ

27 голосов
/ 06 сентября 2011

Для использования 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...