首页 > 解决方案 > 如何在不设置值的情况下通知 c++ 未来?

问题描述

我有一个线程在等待未来。如果我的应用程序被关闭,我想加入该线程。我如何在不捏造它并将其设置为某个值的情况下通知未来?

auto promise = std::promise<std::string>();
...
auto future = promise.get_future();
auto consumer = std::thread([&]
{
   while (future.wait_for(10ms)){
       // do something
       std::cout << future.get().c_str();
   }
});
...
consumer.join();

标签: c++c++11

解决方案


所以 std 线程原语是原语。它们可以直接用于玩具应用程序,其中“提前关闭”意味着“告诉操作系统关闭进程”。

对于更复杂的应用程序,您需要从它们构建东西。

您将需要线程池而不是使用原始线程,您可能需要线程任务的延续,并且您将需要关闭架构。

实现关闭架构的一种方法是使用异常。如果您所有杰出的未来都在代码的中心位中有承诺,您可以对它们设置异常。或者毁掉诺言。两者都会导致人们等待期货以引发异常。

或者您可以强制执行您的所有承诺/期货实际上future<optional<T>>并使用“nullopt”来表示“我们正在关闭”。或使用future<expected<T,Error>>.

另一方面,如果您的异步代码基于延续(包括“继续进入任务队列以在主线程上进行空闲处理”和“继续进入另一个异步任务”),您可以制定一个策略来确定何时延续的来源失败了。一些延续系统给下一个类似std::experimental::expected<Data, Error>. 其他人给它一个准备就绪或错误状态std::future<Data>。在其他情况下,放弃的延续输入会导致延续自动被放弃。

关闭 C++ 应用程序很困难,特别是如果您想按需执行此操作。它基本上需要一个全局事件,以一种干净的方式滚动应用程序中的所有控制路径。没有一个简单的答案。有许多简单的方法可以让它以一种似乎不会导致任何直接问题的方式工作,例如“只是分离线程”或“只是调用exit”。


推荐阅读