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