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

C++ Running boost thread from a constructor of a class

本文关键字:运行 Boost 线程 构造函数      更新时间:2023-10-16

我有一个类,需要一旦实例化,需要立即实例化背景任务,该类别在对象寿命的持续时间内运行。这是代码:

// 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; }是什么?

您的问题是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();
}

构造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();
}

请注意destructor中对std::thread::join()的调用。没有这些,您将获得类似于您在自己的代码中看到的行为类似:当Foo对象不在范围时,线程对象的驱动器的运行。没有拨打join()的呼叫,它将引发例外。在您的代码中,在退出Foo的构造函数上立即抛出了例外;在修订的代码(如果忽略join()(中,当Foo对象被销毁时,它将被抛弃。

我使用了std::thread,因为我不熟悉Boost的线程类。我的理解是它们是一样的,但是我看上去还不够小,无法在此处使用Boost编写代码。