终止正在运行的 boost 线程

Posted

技术标签:

【中文标题】终止正在运行的 boost 线程【英文标题】:terminating a running boost thread 【发布时间】:2014-12-03 05:04:58 【问题描述】:

我目前有一个类似的提升线程

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 被终止

【问题讨论】:

【参考方案1】:

你永远无法安全地终止一个线程,你只需要从外部告诉它它应该停止。如果你中断一个线程,你不知道你在哪里中断了它,你可能会让系统处于未知状态。

您可以检查线程循环中的变量(但要确保它是线程安全的!),而不是永远循环,以查看线程是否应该退出。我在工作线程中所做的是让它们等待条件变量,然后当有工作时它们醒来并开始工作,但是当它们醒来时,它们还会检查“关闭”标志以查看它们是否应该退出。

我的代码的 sn-p:

//-----------------------------------------------------------------------------
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 控制台事件并将它们转换为击键,这样我就可以同时拦截我的自定义关闭事件。

【讨论】:

【参考方案2】:

使用 boost::thread 中断()

#include <iostream>
#include <boost/thread.hpp>
#include <boost/chrono.hpp>

class Foo

private:
    boost::shared_ptr<boost::thread> t;
public:
    Foo()
    
        t = boost::make_shared<boost::thread>(&Foo::SomeMethod, this);
    
    void SomeMethod()
    
        std::cout << "thread starts" << std::endl;
        while(true) 
            std::cout << "." << std::endl;
            boost::this_thread::sleep(boost::posix_time::seconds(1));
        
    
    void stopThread()
    
        t->interrupt();
        t->join();
        std::cout << "thread stopped" << std::endl;
    
;

int main()

    Foo foo;
    boost::this_thread::sleep(boost::posix_time::seconds(5));
    foo.stopThread();
    return 0;

执行

# g++ f.cpp -lboost_thread && ./a.out
thread starts
.
.
.
.
.
thread stopped

【讨论】:

以上是关于终止正在运行的 boost 线程的主要内容,如果未能解决你的问题,请参考以下文章

如何正确的终止正在运行的子线程

主应用程序处于 while 循环时,boost 线程未运行

Java中终止正在运行线程

如何停止一个正在运行的线程?

c++11的线程,怎么终止

如何停止一个正在运行的线程