我刚刚阅读了文章’
Futures Done Right‘,c 11承诺的主要缺点似乎是从现有的创造复合期货
我现在正在查看boost::wait_for_any的文档
但请考虑以下示例:
int calculate_the_answer_to_life_the_universe_and_everything() { return 42; } int calculate_the_answer_to_death_and_anything_in_between() { return 121; } boost::packaged_task<int> pt(calculate_the_answer_to_life_the_universe_and_everything); boost:: future<int> fi=pt.get_future(); boost::packaged_task<int> pt2(calculate_the_answer_to_death_and_anything_in_between); boost:: future<int> fi2=pt2.get_future(); .... int calculate_the_oscillation_of_barzoom(boost::future<int>& a,boost::future<int>& b) { boost::wait_for_all(a,b); return a.get() + b.get(); } boost::packaged_task<int> pt_composite(boost::bind(calculate_the_oscillation_of_barzoom,fi,fi2)); boost:: future<int> fi_composite=pt_composite.get_future();
解决方法
when_any和when_all是构成期货的完美有效方式.它们都对应于并行组合,其中复合操作等待一个或所有组合操作.
我们还需要顺序组合(不在Boost.Thread中).例如,这可能是一个未来的< T> :: then函数,它允许您排队使用未来值的操作,并在未来准备就绪时运行.可以自己实现这一点,但需要进行效率权衡. Herb Sutter在他的recent Channel9 video中谈到了这一点.
N3428是将这些功能(以及更多)添加到C标准库的提案草案.它们都是库功能,不会为该语言添加任何新语法.另外,N3328是一个为可恢复函数添加语法的提议(比如在C#中使用async / await),它将在内部使用future< T> :: then.