期货与承诺
Futures vs. Promises
本文关键字:承诺 更新时间:2023-10-16
我混淆了未来和承诺之间的区别。
显然,他们有不同的方法和东西,但实际用例是什么?
是吗?:
- 当我管理一些异步任务时,我使用 future 来获取"将来"的值
- 当我是异步任务时,我使用 promise 作为返回类型,以允许用户从我的承诺中获得未来
Future 和 Promise 是异步操作的两个独立方面。
异步操作的"生成者/编写器"使用std::promise
。
std::future
由异步操作的"使用者/读取器"使用。
它被分成这两个独立的"接口"的原因是向"消费者/读取器"隐藏"写入/设置"功能。
auto promise = std::promise<std::string>();
auto producer = std::thread([&]
{
promise.set_value("Hello World");
});
auto future = promise.get_future();
auto consumer = std::thread([&]
{
std::cout << future.get();
});
producer.join();
consumer.join();
使用 std::p romise 实现 std::async 的一种(不完整的)方法是:
template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
typedef decltype(func()) result_type;
auto promise = std::promise<result_type>();
auto future = promise.get_future();
std::thread(std::bind([=](std::promise<result_type>& promise)
{
try
{
promise.set_value(func()); // Note: Will not work with std::promise<void>. Needs some meta-template programming which is out of scope for this question.
}
catch(...)
{
promise.set_exception(std::current_exception());
}
}, std::move(promise))).detach();
return std::move(future);
}
使用std::packaged_task
这是一个帮助程序(即它基本上执行我们上面所做的工作),您可以执行以下操作std::promise
这些操作更完整且可能更快:
template<typename F>
auto async(F&& func) -> std::future<decltype(func())>
{
auto task = std::packaged_task<decltype(func())()>(std::forward<F>(func));
auto future = task.get_future();
std::thread(std::move(task)).detach();
return std::move(future);
}
请注意,这与std::async
略有不同,在中,返回的std::future
在销毁时实际上会阻塞,直到线程完成。
相关文章:
- Linux承诺的内存比它所能提供的要多
- 承诺可以使用结构类型吗?
- c++ 线程和承诺
- 从模板生成承诺 可调用
- 存储/传递 v8 承诺解析器供以后使用的最佳实践?(结合C++线程)
- 错误:移动承诺时"Attempt to use a deleted function"
- 清除所有事物后,所承诺的记忆保持不变
- 在相应的承诺离开范围后有效使用未来
- STD ::承诺外部代码,异步取消
- 使用std :: future and std ::通过非std ::螺纹承诺安全吗?
- 如何通过std ::承诺进入线程?由STD :: Move或STD :: Shared_ptr
- C ++:通过承诺packaged_task
- 如何移动内部有承诺的结构
- 像JavaScript这样的C ++期货/承诺
- 期货与承诺
- 派生类构造函数上的Noexcept promise:可以在没有对基构造函数上的Noexcept进行承诺的情况下使用
- C++11期货/承诺中没有状态错误
- 履行(可能无效的)承诺
- 为什么 VC++ 2013 不支持承诺的非静态数据成员初始值设定项
- C++"最终"方法注释对类设计有什么承诺?