gpt4 book ai didi

c++ - 如何在不设置值的情况下通知 C++ future ?

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:59 25 4
gpt4 key购买 nike

我有一个等待 future 的线程。如果我的应用程序关闭,我想加入该线程。我如何着手通知 future 而不捏造它并将其设置为某个值?

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 都在一段核心代码中得到 promise ,您可以 set exception在他们。或毁掉 promise 。两者都会导致人们等待 future 抛出异常。

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

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

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

关于c++ - 如何在不设置值的情况下通知 C++ future ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52630681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com