2015-06-01 65 views
2

我正在使用下面的簡單程序來爲命令行上指定的參數生成睡眠。我們如何中斷主線程

我找不到對應於主線程的boost::thread對象。使用empt thread_objsleep正在工作,但boost :: thread對象在我運行程序時不會中斷。

那麼,爲什麼我沒有得到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

嗯。我離開了那部分的答案:)這是在我的評論:http://stackoverflow.com/questions/30571271/how-can-we-interrupt-the-main-thread/30572147?noredirect=1#comment49214182_30571271。現在編輯 – sehe