我有一个线程在等待未来。在我的应用程序关闭的情况下,我想加入线程。我该如何在不弄虚作假并将其设定为一定价值的情况下通知未来?
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();
答案 0 :(得分:2)
因此std线程基元就是基元。它们可以直接用于玩具应用程序,其中“提前关闭”表示“告诉操作系统关闭该过程”。
对于更复杂的应用程序,您需要从中构建事物。
您将需要线程池而不是使用原始线程,您可能希望继续执行线程任务,并且需要关闭体系结构。
实现关闭体系结构的一种方法是使用异常。如果所有出色的未来都在核心代码中都有承诺,那么您可以set exception。或破坏诺言。两者都导致人们在等待期货时抛出异常。
或者您可以强制所有所有承诺/未来实际上是future<optional<T>>
,并使用“ nullopt”来表示“我们正在关闭”。或使用future<expected<T,Error>>
。
另一方面,如果您的异步代码基于延续(包括“继续进入任务队列以在主线程上进行空闲处理”和“继续进入另一个异步任务”),则可以对源代码的使用时间制定政策的延续失败。一些延续系统给下一个延续系统一个std::experimental::expected<Data, Error>
之类的东西。其他人则将其置于准备就绪或错误状态std::future<Data>
。在其他情况下,连续的放弃输入会导致连续自动消失。
关闭C ++应用程序很困难,特别是如果您想按需执行它。它基本上需要一个全局事件,该事件以一种干净的方式向下滚动应用程序中的所有控制路径。没有一个简单的答案。有很多简单的方法可以使它以似乎不会引起任何直接问题的方式进行工作,例如“仅断开线程”或“仅调用exit
”。