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

标签 c++ c++11

我有一个线程正在等待 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/

相关文章:

c++ - boost::fusion::map 允许重复键

c++ - 如何在 unix 上将控制台光标移动到 (x, y)?

c++ - 交换指针后删除动态分配的内存

qt - 是否可以在不使用成员函数的情况下实现 Q_PROPERTY READ/WRITE 访问器?

c++ - 在另一个全局仿函数中引用全局仿函数

c++ - 私有(private)方法作为尾随返回类型 (decltype)

c++ - 从类对象到结构变量的 memcpy

过多限制特化的 C++ 模板声明

c++ - 丰富的数字测试

c++ - 为什么在代码段中从 char* 转换为 std::string 比转换为 const char* 更受欢迎?