C 从类的构造函数运行Boost线程
C++ Running boost thread from a constructor of a class
我有一个类,需要一旦实例化,需要立即实例化背景任务,该类别在对象寿命的持续时间内运行。这是代码:
// 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编写代码。
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 为什么 boost::asio::ip::tcp::basic_stream_socket::available 的运行
- 仅在 boost::hash_combine 中运行一个程序期间保证确定性
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?
- 如何使用 boost::asio io_service 运行函数异步
- 两个并发的 Python 进程可以在 Boost Python 中运行吗?
- 如何使用boost.thread运行多个接收器,每个线程应该分配给每个接收器?
- 在 boost::p ython 中的 python 对象中运行 python 代码
- 使用 boost::thread 运行函子,但析构函数被错误地调用
- boost SHA1 哈希与 md5sum/sha1sum 的运行时比较
- BOOST ::日志是每次运行应用程序时都可能旋转文件
- C 从类的构造函数运行Boost线程
- 运行 boost::asio 异步服务器以及命令循环
- 如何在QT Creator中运行Boost单元测试
- 从 Visual Studio 2010 运行 BOOST 单元测试
- 如何在端口 80 上运行 Boost.Asio 服务器
- 如何在许多处理器上运行 boost::threads
- 在不同进程上运行Boost单元测试
- 在boost线程中运行boost asio io_service