std::future 或 std::shared_future 等待多个线程
std::future or std::shared_future to wait for multiple threads
我有一个线程,它从容器中获取每个元素并向数据库发送上传请求。上传是同步完成的。
容器中的元素是金融合约,它们可能有也可能没有与之关联的数据结构调用 ticktable。
现在,对于那些有勾号表的合约,我必须进行两次上传。 1) 首先将刻度表上传到数据库。DB 返回一个 ID。 2) 将 ID 附加到合同中,然后上传合同。
例如,如果我循环使用具有 100 个合约的容器,假设其中 30 个具有 ticktable,其余 70 个没有。
我正在尝试弄清楚std::future
或std::shared_future
是否适合这样的任务?
我试图通过与 30 个合约中的每一个相关联的未来来实现,并使用 launch:async 策略调用 std::async。因此,在循环的第一遍中,启动 3o 线程,返回的未来被"移动"到与合约关联的容器中。 其他 70 份合约只是以通常的方式上传。
在第二遍中,我希望在存储的未来上调用get()
。如果请求完成,请获取 ID 并用它完成合约上传。这可能行不通,因为我认为将未来移动到容器会分离线程。
请您告知我应该采取什么样的方法来实施我想要的行为吗?
移动未来会导致其状态移动到目标。 所以不,你没有你认为你有的问题。
您的ticktable解决方案看起来像未来的未来 - 一个用于ticktable上传的未来,一个用于合约上传。 但从某种意义上说,未来就是未来。
因此,一种方法是将未来的未来折叠成未来。
假设您有一个合约类型Contract
(我假设它是伪常规类型)。 绑定您的 ticktable id 是类型function<void(Contract&)>
的操作。 有趣的是,这样的操作也可能是一个noop。
所以有一个std::future<void(Contract&)> Contract::PrepareForUpload() const
. 对于您要上传的每个合同,请去做。
带有 ticktable 的那些返回拥有线程的std::async
生成的future
。
没有 ticktable 的那些返回一个延迟std::async
,其中包含一个 noop[]{return [](auto&&...){};}
工厂。
接下来,添加std::future<void> Contract::Upload(std::function<void(Contract&>) const
,它运行准备代码然后进行上传(为什么在这里这样做?我稍后会展示)。
现在上传的操作是:
auto prep = contract.PrepareForUpload();
auto upload = contract.Upload(prep.get());
现在这有点烦人。 做两件事? 哎呀。
为什么不为我们做呢?
std::future<void> Contract::Upload() const {
return std::async(
std::launch::async,
[this]{
auto prep = contract.PrepareForUpload();
return contract.Upload(prep.get());
}
);
}
现在Contract::Upload
会自动为您准备和上传。
然而,这会在滴答声的情况下启动 2 个 thrads。 因此,编写一个可以在"组合"Upload
情况下调用的同步PrepareForUpload
。
如果PrepareForUpload
需要额外的参数,我们可以将它们传递给Upload
.
可能有一些你没有涵盖的细节可能会使这个骗局更棘手,但期货链的正确答案通常是将链条折叠成一个未来。
C++1z提出了.then
和类似功能的建议,以使这种链折叠变得简单高效。
- 架构决策:返回std::future还是提供回调
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 修改在 std::future 的 lambda 中引用捕获的值
- C++ std::future没有被调用
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- Make zmqpp::socket::connect a std::future
- std::future可以比std::promise活得更长吗
- std::future::get()或std::future::wait()是std::thread::join()的替
- 当 std::future 准备好被检索时发出信号主线程
- 当多次调用时,"std::future::then"的行为是什么?
- 使用 std::future 的不完整类型无效使用
- 为什么 std::future::wait_for 的行为不符合预期?
- 是什么给了 std::future 一些共享状态
- STD :: Future no_state异常与断言
- 标准是否保证在移动std::p ackaged_task后安全使用std::future?
- 将 Boost 链与 std::future 结合使用
- 删除 std::future 和 std::p romise 的空白专用化
- std::future给了我错误3,我做错了什么
- 如何在 std::future 的向量中调用异步函数
- 在 std::future::unwrap() 和 std::future::get() 中竞争