在构造函数中使用std :: async

时间:2016-10-13 20:30:47

标签: multithreading c++11 stdasync

我对C ++ 11功能std::async很陌生,我无法理解为什么下面的代码永远不会打印bar

有人可以为我解释一下吗?

class Thready {

  public:

    Thready() {
        std::async(std::launch::async, &Thready::foo, this);
    }

    void foo() {
        while (true) {
            std::cout << "foo" << std::endl;
        }
    }

    void bar() {
        while (true) {
            std::cout << "bar" << std::endl;
       }
    }
};

int main() {  
    Thready t;
    t.bar();
}

1 个答案:

答案 0 :(得分:2)

请参阅此页面上的“备注”部分:http://en.cppreference.com/w/cpp/thread/async

  

实现可能会扩展第一次重载的行为   std :: async通过启用其他(实现定义的)位   默认启动政策。实现定义的启动示例   策略是同步策略(在异步中立即执行   调用)和任务策略(类似于异步,但线程本地不是   如果未从std :: async获取的std :: future未从中移除   或者绑定到引用,std :: future的析构函数将被阻塞   在完整表达式结束之前,直到异步操作   完成,基本上生成以下同步代码:

std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f()
std::async(std::launch::async, []{ g(); }); // does not start until f() completes
  

(注意std ::期货的析构函数   通过调用std :: async never block)获得的其他方法

TL; DR:

尝试将std :: async调用的返回值保存到某个变量中:

auto handle = std::async(std::launch::async, &Thready::foo, this);

编辑:

以下代码应该按预期工作。

#include <future>
#include <iostream>

class Thready {

  public:

    Thready() {
        handle = std::async(std::launch::async, &Thready::foo, this);
    }

    void foo() {
        while (true) {
            std::cout << "foo" << std::endl;
        }
    }

    void bar() {
        while (true) {
            std::cout << "bar" << std::endl;
       }
    }

    std::future<void> handle;
};

int main() {  
    Thready t;
    t.bar();
}