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 ...).
| 归档时间: |
|
| 查看次数: |
2025 次 |
| 最近记录: |