С потоками я знаю, что 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().
th
s деструктор вызовет 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;
}
Когда осталось execit()
, фьючерсы f1
и f2
уничтожаются.Но их темы все еще должны работать?Деструктор Fibrec
называется, конечно. Но куда идут потоки? Программа не аварийно завершает работу, так что я думаю, что она присоединилась?Или может быть отстранен?Или они остановлены или отменены?Я считаю, что это не тривиально в C ++ 11?