【问题标题】:C++ Running boost thread from a constructor of a classC++ 从类的构造函数运行 boost 线程
【发布时间】:2017-05-04 11:31:48
【问题描述】:

我有一个类,它需要在类本身实例化后立即实例化一个后台任务,该任务在对象的生命周期内运行。代码如下:

// Foo.cpp
#include <boost/thread.hpp>

// Constructor
Foo::Foo() {

  boost::thread thread(&Foo::bar, this)
  // do other stuff
}

// Background method
void Foo::bar() const {
  // do some background stuff forever, sleep, etc
}

但是,一旦调用了该类,程序就会立即终止——它显示aborted。 IE。我有一个简单的main() 函数,它只创建一个简单的对象并返回0,int main { Foo f; return 0; } 做什么?

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    您的问题是 boost::thread 对象在构造函数功能块的末尾被破坏。如果您希望线程对象在 Foo 对象的整个生命周期内都存在,只需使线程成为 Foo 类的成员并在构造函数中构造该成员:

    class Foo {
        boost::thread theThread;
    
        Foo();
        ~Foo();
    
        void bar() const;
    
        // other stuff
    };
    
    Foo::Foo()
        : theThread(&Foo::bar, this)
    {
        // do other stuff
    }
    
    Foo::~Foo() {
        theThread.join();
    }
    

    【讨论】:

      【解决方案2】:

      当您构造 Foo 对象时,Foo 的构造函数运行。当构造函数完成时,你就得到了你的对象。但是由于 thread 对象是构造函数的本地对象,因此当构造函数退出时,thread 对象的析构函数运行,并且您的线程对象不再存在。需要在类中定义一个thread对象,并在构造函数中初始化:

      struct Foo {
          Foo();
          ~Foo();
          void bar() const;
          std::thread thr;
      };
      
      Foo:Foo() : thr(&Foo::bar, this) {
      }
      
      Foo::~Foo() {
          thr.join();
      }
      

      注意在析构函数中对std::thread::join() 的调用。没有它,您将获得类似于您在自己的代码中看到的行为:当Foo 对象超出范围时,线程对象的析构函数运行。如果不调用 join() 将引发异常。在您的代码中,退出Foo 的构造函数时会立即引发异常;在修改后的代码中(如果你省略了join()),它将在Foo 对象被销毁时抛出。

      我使用了std::thread,因为我不熟悉 Boost 的线程类。我的理解是它们是相同的,但是我没有仔细看这里使用 Boost 编写代码。

      【讨论】:

      • 但是如果 bar() 执行了一个无休止的任务(在这种情况下,我在那里有一个无休止的 while 循环),然后当调用析构函数时它加入主线程,程序永远不会终止......也许线程可以在析构函数中以某种方式被杀死
      • 这是一个不同的问题。是的,你必须有办法告诉线程你希望它停止。
      猜你喜欢
      • 2015-06-30
      • 2012-03-03
      • 1970-01-01
      • 2011-05-29
      • 2017-03-24
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多