2014-12-03 69 views
2

我現在有一個提升線程這樣終止正在運行的升壓線程

class foo 
{ 
    private: 
    boost::shared_ptr<boost::thread> t; 
    public: 
    foo() 
    { 
    t = boost::make_shared<boost::thread>(&foo::SomeMethod,this); 
    } 
    void SomeMethod() 
    { 
    while(true) 
    { 
     .... //Does some work 
    boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); //sleep for 5 seconds 
    } 
    } 

    void stopThread() 
    { 
    //Elegant and instant way of stopping thread t 
    } 
} 

我從this後閱讀,你必須然而定義斷點我不知道如果我明白怎麼會適合我場景。我正在尋找一種安全優雅的方式,以確保線程t終止

回答

3

你永遠不可能安全終止一個線程,你只需要告訴它從外面它應該停止。如果中斷某個線程,則不知道中斷它的位置,並且可能使系統處於未知狀態。

而是無休止的循環下去,你可以檢查變量(確保它是線程安全的,但!)線程的循環內,看是否線程應該退出。我在工作線程中做的事情是讓他們等待一個條件變量,然後在工作時醒來並開始工作,但是當他們清醒時,他們還檢查「關閉」標誌以查看是否應該退出。

我的代碼片段:

//----------------------------------------------------------------------------- 
void Manager::ThreadMain() { 
    unique_lock<mutex> lock(m_work_mutex, std::defer_lock); 
    while(true) { 
     lock.lock(); 
     while(m_work_queue.empty() && !m_shutdown) { 
      m_work_signal.wait(lock); 
     } 

     if(!m_work_queue.empty()) { 

      // (process work...) 
      continue; 
     } 

     // quit if no work left and shutdown flag set. 
     if(m_shutdown) return; 
    } 
} 

也許你可以用類似逃脫:

std::atomic<bool> stop_thread = false; 

void SomeMethod() 
{ 
    while(!stop_thread) 
    { 
    .... //Does some work 
    boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); //sleep for 5 seconds 
    } 
} 

void stopThread() 
{ 
    stop_thread = true; 

    // join thread (wait for it to stop.) 
    t->join(); 
} 

讓我告訴你,有時是不容易使一些安全出口。幾個星期前,我在線程控制檯輸入方面遇到了很大的困難。我最終不得不處理原始的Windows控制檯事件,並將它們自己翻譯成按鍵,這樣我就可以同時攔截我的自定義關閉事件。