Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从类的构造函数运行boost线程_C++_Multithreading_Boost - Fatal编程技术网

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循环),然后在调用析构函数时它加入主线程,那么程序永远不会终止。。。也许线程可以在析构函数中被终止,这是另一个问题。是的,您必须有一种方法告诉线程您希望它停止。