未来离开范围时,线程在哪里?

tow*_*owi 6 c++ multithreading c++11

我知道terminate()在线程变量离开作用域时调用的线程:

size_t fibrec(size_t n) {
  return n<2 ? 1 : fibrec(n-2)+fibrec(n-1);
}

int main() {
    std::thread th{ fibrec, 35 };
    // no join here
} // ~th will call terminate().
Run Code Online (Sandbox Code Playgroud)

th析构函数terminate()在离开作用域时会调用.

但那是什么future?他们运行的线程在哪里?它是分离的吗?它是如何结束的?

#include <iostream>
#include <future> // async
using namespace std;

size_t fibrec(size_t n) {
    return n<2 ? 1 : fibrec(n-2)+fibrec(n-1);
}

struct Fibrec {
    size_t operator()(size_t n) { return fibrec(n); }
    const size_t name_;
    Fibrec(size_t name) : name_(name) {}
    ~Fibrec() { cerr << "~"<<name_<< endl; }
};

void execit() {
    auto f1 = async( Fibrec{33}, 33 );
    auto f2 = async( Fibrec{34}, 34 );
    // no fx.get() here !!!
}; // ~f1, ~f2, but no terminate()! Where do the threads go?

int main() {
    auto f0 = async( Fibrec{35}, 35 );
    execit();
    cerr << "fib(35)= " << f0.get() << endl;
}
Run Code Online (Sandbox Code Playgroud)

何时execit()离开期货f1并被f2销毁.但他们的线程应该还在运行?Fibrec当然叫做析构函数.但线程在哪里?程序没有崩溃,所以我想,加入了吗?或者可能超脱?或者他们被停止或取消?我相信在C++ 11中这不是一件容易的事吗?

Ton*_*ion 12

future是异步操作的结果,它本身不是一个线程.该async函数生成一个新线程来执行计算,完成后,结果将写入future对象.

根据实施的政策,您将要么致电,.get() 要么.wait()将来取得结果.调用它将在调用它的线程上完成工作

如果策略std::launch::async然后在其自己的线程上运行INVOKE(fff,xyz ...).当此线程完成时,返回的std :: future将变为就绪状态,并将保存函数调用抛出的返回值或异常.与返回的std :: future的异步状态关联的最后一个对象的析构函数将阻塞,直到将来准备就绪.

如果策略是std::launch::deferredfff,则xyz ...作为延迟函数调用存储在返回的std :: future中.对共享相同关联状态的未来的第一次调用wait()或get()成员函数将在调用wait()或get()的线程上同步执行INVOKE(fff,xyz ...).

  • 这就是我需要的引用:*与返回的std :: future的异步状态相关联的最后一个对象的析构函数将阻塞,直到将来准备就绪.* (3认同)