2015-06-01 2 views
2

Я использую ниже простую программу для генерации спящего режима для аргумента, указанного в командной строке.Как мы можем прервать основной поток

Не удается найти объект boost::thread, соответствующий основной теме. Используя empt thread_obj, работает sleep, но boost :: объект потока не прерывается при каждом запуске программы.

Так есть какая-то конкретная причина, по которой я не получаю прерывание для объекта boost::thread?

#include<iostream> 
#include<boost/thread/thread.hpp> 
#include<boost/date_time/date.hpp> 

using namespace boost; 
using namespace std; 

boost::thread thread_obj; 
boost::thread thread_obj1; 

void func(void) 
{ 
     char x; 
     cout << "enter y to interrupt" << endl; 
     cin >> x; 
     if(x == 'y') 
     { 
       cout << "x = 'y'" << endl; 
       thread_obj.interrupt(); 
       cout << "thread interrupt" << endl; 
     } 
} 

int main(int argc,char **argv) 
{ 
     thread_obj1 = boost::thread(&func); 
     boost::system_time const timeout = boost::get_system_time() + boost::posix_time::seconds(atoi(argv[1])); 
     try 
     { 
       boost::this_thread::sleep(timeout); 
     } catch(boost::thread_interrupted &) 
     { 
       cout <<"thread interrupted" << endl; 
     } 
} 
+1

Понятия не имею, что вы делаете с 'thread_obj': нет резьбы прилагается к нему! –

+0

@LightnessRacesinOrbit boost :: Thread_obj создан только для применения сна ... возможно ли это сделать ... ?? –

+2

№ На какой нить будет применен спать? Это не имеет смысла. –

ответ

0

Я не думаю, что можно использовать точки прерывания на основном потоке (так как boost не контролирует его). Точки прерывания полагаются на довольно немного скрытой машины Boost Thread под капотом.


Если вы хотите «применить» сон о текущем использовании нити this_thread.

Боюсь, вы не можете прервать основную нить. Тем не менее, вы можете просто запустить основную программу на отдельном потоке, что вы присоединитесь сразу:

Live On Coliru

#include <iostream> 
#include <boost/thread/thread.hpp> 
#include <boost/date_time/date.hpp> 

using namespace boost; 
using namespace std; 

boost::thread thread_obj; 
boost::thread thread_obj1; 

void func(void) 
{ 
    char x; 
    cout << "enter y to interrupt" << endl; 
    cin >> x; 
    if (x == 'y') { 
     cout << "x = 'y'" << endl; 
     thread_obj.interrupt(); 
     cout << "thread interrupt" << endl; 
    } 
} 

void real_main() { 
    boost::system_time const timeout = boost::get_system_time() + boost::posix_time::seconds(3); 
    try { 
     boost::this_thread::sleep(timeout); 
    } 
    catch (boost::thread_interrupted &) { 
     cout << "thread interrupted" << endl; 
    } 
} 

int main() 
{ 
    thread_obj1 = boost::thread(&func); 
    thread_obj = boost::thread(&real_main); 
    thread_obj.join(); 
} 
+0

Thnx @sehe ... я знаю этот метод создания потока, но не существует никакого способа, как без создания отдельного потока сна мы можем применить функцию прерывания непосредственно на созданном thread_obj ... ?? –

+0

Mmm. Я оставил эту часть из ответа :) Это было в моем комментарии: http://stackoverflow.com/questions/30571271/how-can-we-interrupt-the-main-thread/30572147?noredirect=1#comment49214182_30571271. Отредактировано сейчас – sehe

Смежные вопросы