c++ - 终止正在运行的 boost 线程

标签 c++ multithreading boost boost-thread

我目前有一个这样的 boost 线程

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

最佳答案

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

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

我的代码片段:

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

关于c++ - 终止正在运行的 boost 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264029/

相关文章:

连接到 Redis 时永远不会终止的 Objective-C 控制台应用程序

c++ - 使用 string 和 int(like) 类型初始化模板类的静态成员

c++ - boost 库是否依赖于 std C++ 库?

c++ - 如何在 C++ 中进行 regex_match #(哈希符号)?

python - 如何将 python 脚本通过管道传递给命令 (boost::program::options)

c++ - 不同位数的均匀分布的随机值

c++ - std::make_shared 构造函数中的参数个数

c++ - QRegularExpression 是否删除了反向引用(因此搜索速度更快)

c++ - 静态类变量的编译器错误

python - WX.Python 和多处理