【发布时间】:2017-10-12 18:50:35
【问题描述】:
来自n3721“std::future 和相关 API 的改进”中对 C++20 中即将推出的功能的引用的跟进
#include <iostream>
#include <future>
#include <exception>
using std::cout;
using std::endl;
int main() {
auto prom_one = std::promise<std::future<int>>{};
auto fut_one = prom_one.get_future();
std::thread{[prom_one = std::move(prom_one)]() mutable {
auto prom_two = std::promise<int>{};
auto fut_two = prom_two.get_future();
prom_two.set_value(1);
prom_one.set_value(std::move(fut_two));
}}.detach();
auto inner_fut_unwrap = fut_one.unwrap();
auto inner_fut_get = fut_one.get();
auto th_one = std::thread{[&]() {
cout << inner_fut_unwrap.get() << endl;
}};
auto th_two = std::thread{[&]() {
cout << inner_fut_get.get() < endl;
}};
th_one.join();
th_two.join();
return 0;
}
在上面的代码中,哪个会赢得打印1 的竞赛? th_one 还是 th_two?
为了澄清我在说什么种族,这里有两种(潜在的)种族问题,后者是真正让我困惑的一种。
第一个是内在未来的设定和展开;即使没有在内部未来调用实际的set_value,未包装的未来也应该作为内部未来的合适代理。所以unwrap() 必须返回一个公开线程安全接口的代理,而不管另一端发生什么。
另一种情况是未来的get() 的代理已经存在于其他地方,在此示例中inner_fut_unwrap 是inner_fut_get 的代理。在这种情况下,谁应该赢得比赛?未包装的未来或通过在外部未来上调用get() 获取的未来?
【问题讨论】:
-
unwrap不再是东西了。让我们不要讨论旧论文中的假设特征。 -
@T.C.我在哪里可以找到有关期货的最新论文?我假设open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3857是最新的,这里似乎没有新的open-std.org/jtc1/sc22/wg21/docs/papers
-
@T.C.也知道它被删除了吗?
-
它已经进入了并发 TS,这是您应该寻找的地方。至于为什么,你得问问别人。
标签: c++ c++11 future unwrap c++20