C++ C++;从类的构造函数运行boost线程
我有一个类,它需要在类本身实例化后立即实例化后台任务,该类在对象的生命周期内运行。代码如下:C++ C++;从类的构造函数运行boost线程,c++,multithreading,boost,C++,Multithreading,Boost,我有一个类,它需要在类本身实例化后立即实例化后台任务,该类在对象的生命周期内运行。代码如下: // 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 bac
// 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
}
//Foo.cpp
#包括
//建造师
Foo::Foo(){
boost::thread线程(&Foo::bar,this)
//做其他事情
}
//背景法
void Foo::bar()常量{
//永远做一些背景材料,睡觉,等等
}
然而,一旦类被调用,程序就会立即终止——它表示
已中止
。也就是说,我有一个简单的main()
函数,它只创建一个简单对象并返回0,int main{Foo f;返回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();
}
struct Foo {
Foo();
~Foo();
void bar() const;
std::thread thr;
};
Foo:Foo() : thr(&Foo::bar, this) {
}
Foo::~Foo() {
thr.join();
}
构造
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();
}
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的thread类。我的理解是它们是一样的,但我没有仔细研究如何在这里使用Boost编写代码。但是如果bar()执行一个无休止的任务(在这里我有一个无休止的while循环),然后在调用析构函数时它加入主线程,那么程序永远不会终止。。。也许线程可以在析构函数中被终止,这是另一个问题。是的,您必须有一种方法告诉线程您希望它停止。