2014-12-03 45 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控制台事件,并将它们自己翻译成按键,这样我就可以同时拦截我的自定义关闭事件。