如何在不设置值的情况下通知 c++ 未来?

How do I notify a c++ future without setting a value?

本文关键字:通知 情况下 c++ 未来 设置      更新时间:2023-10-16

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

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();

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

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

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

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

或者你可以强制要求你所有的承诺/期货实际上都是future<optional<T>>的,并使用"nullopt"说"我们正在关闭"。 或使用future<expected<T,Error>>.

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

关闭C++应用程序很困难,尤其是当您想按需关闭时。 它基本上需要一个全局事件,以干净的方式向下滚动应用中的所有控制路径。 没有一个简单的答案。 有许多简单的方法可以让它以一种似乎不会引起任何直接问题的方式工作,比如"只是分离线程"或"只是调用exit"。