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 线程的主要内容,如果未能解决你的问题,请参考以下文章