C++ 从类的构造函数运行 boost 线程

Posted

技术标签:

【中文标题】C++ 从类的构造函数运行 boost 线程【英文标题】:C++ Running boost thread from a constructor of a class 【发布时间】: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; 做什么?

【问题讨论】:

【参考方案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 循环),然后当调用析构函数时它加入主线程,程序永远不会终止......也许线程可以在析构函数中以某种方式被杀死 这是一个不同的问题。是的,你必须有办法告诉线程你希望它停止。

以上是关于C++ 从类的构造函数运行 boost 线程的主要内容,如果未能解决你的问题,请参考以下文章

C++ Boost 序列化、构造函数和数据复制

C++ boost线程在实例化两次时导致分段错误

c++ 如何在构造函数中启动一个线程,从命名管道读取数据?

boost::variant 中持有的类的复制构造函数的问题

复制构造函数中的c ++用户定义成员

Boost Python 暴露 C++ 类,构造函数采用 std::list