ускоренный поток при прерывании не печатает выходное сообщение

У меня есть этот фрагмент кода для выполнения трех потоков, где второй поток должен прерываться при нажатии клавиши ввода и печатать сообщение о выходе:

void input_val()
{
    // DO STUFF
return;
}

void process_val()
{
       // DO STUFF
       try{
        cout << "waiting for ENTER..." << endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(200));
    }
    catch(boost::thread_interrupted&){
        cout << "exit process thread" << endl;
        return;
    }
    return;
}


void output_val()
{
    // DO STUFF
}

int main()
{
    char key_pressed;

    boost::thread input_thread(boost::bind(&input_val));
    boost::thread process_thread(boost::bind(&process_val));
    boost::thread output_thread(boost::bind(&output_val));

    cin.get(key_pressed);
    process_thread.interrupt();

    input_thread.join();
    process_thread.join();
    output_thread.join();
    return 0;
}

Process_thread прерывается при нажатии «ENTER», но не печатает «сообщение о выходе из потока процесса». Может ли кто-нибудь подсказать, в чем может быть проблема, потому что у меня вчера аналогичная программа работала правильно. Заранее спасибо!


person ND_27    schedule 26.09.2013    source источник
comment
У меня работает, если увеличить тайм-аут до 2000 мс. Компилятор, платформа, версии?   -  person dyp    schedule 27.09.2013
comment
Примечание: cin.get(key_pressed); в этом случае cin.ignore(); должно быть достаточно, так как вы не используете ввод.   -  person dyp    schedule 27.09.2013


Ответы (1)


Поток, выполняющий process_val, спит всего 200 мс, поэтому, если вы не можете нажать клавишу менее чем через 200 мс после запуска программы, этот поток уже вернулся, и попытка/поймать больше не действует. Если вы увеличите сон до нескольких тысяч мс, у вас должно быть время, чтобы нажать клавишу, пока он ждет.

person nobody    schedule 27.09.2013
comment
Ааа.. это было довольно очевидно! Но большое спасибо за ответ на такой глупый вопрос. Я просто был невнимателен. - person ND_27; 27.09.2013