如何在不设置值的情况下通知 c++ 未来?
How do I notify a c++ future without setting a value?
我有一个线程在等待未来。如果我的应用程序关闭,我想加入线程。我如何在不捏造未来并将其设置为某个值的情况下通知未来?
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
"。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在C++中如何在没有pow的情况下进行基础计算
- 如何在不设置值的情况下通知 c++ 未来?
- 如何在不使用全局变量的情况下通知外部线程主线程状态
- 如何在QDataWidgetMapper中未提交更改的情况下通知用户
- 如何在没有全局挂钩的情况下获得鼠标/键盘活动的通知