加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std :: future或std :: shared_future等待多个线程

发布时间:2020-12-16 06:51:54 所属栏目:百科 来源:网络整理
导读:我有一个线程从容器中获取每个元素并向数据库发送上传请求.上传是同步完成的. 容器中的元素是金融合约,它们可能有也可能没有与之关联的数据结构调用. 现在,对于那些有可选择的合同,我必须进行两次上传. 1)首先将ticktable上传到db. db给出了一个id. 2)将id附
我有一个线程从容器中获取每个元素并向数据库发送上传请求.上传是同步完成的.

容器中的元素是金融合约,它们可能有也可能没有与之关联的数据结构调用.

现在,对于那些有可选择的合同,我必须进行两次上传. 1)首先将ticktable上传到db. db给出了一个id.
2)将id附加到合同上,然后上传合同.

因此,例如,如果我在具有100个合同的容器上循环,可以说其中30个具有可勾选而其余70个没有.

我想弄清楚std :: future或std :: shared_future是否适合这样的任务?

我尝试通过将未来与30个合同中的每一个相关联来实现,并使用launch:async policy调用std :: async.因此,在循环的第一次传递中,启动3个线程,并将返回的未来“移动”到与合同关联的容器.
其他70份合约只是按常规方式上传.

在第二遍中,我希望在存储的未来上调用get().如果请求已完成,请获取ID并使用它完成合同上载.这可能不会起作用,因为我认为将未来移动到容器将分离线程.

请问您应该采取什么样的方法来实施我想要的行为?

解决方法

移动未来会导致其状态移至目标.所以不,你没有你认为的问题.

您的可选择解决方案看起来像未来期货 – 可选择上传的一个未来,一个用于合同上传.但从某种意义上说,未来的未来是未来.

因此,一种方法是将未来的未来融入未来.

假设你有一个契约类型契约(我假设它是伪常规类型).绑定您的ticktable id是类型函数< void(Contract&)>的操作.有趣的是,这样的操作也可以是一个noop.

所以有一个std :: future< void(Contract&)> Contract :: PrepareForUpload()const.对于您要上传的每份合约,请选择它.

具有ticktable的那些返回std :: async生成的拥有线程的未来.

没有ticktable的那些返回包含noop [] {return [](auto&& …){};}工厂的延迟std :: async.

接下来,添加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.因此编写一个可以在“组合”上传案例中调用的同步PrepareForUpload.

如果PrepareForUpload需要额外的参数,我们可以将它们传递给Upload.

你可能还没有提到可能会产生这种诡计的细节,但对一系列期货的正确答案通常是将链条折叠成一个未来.

C 1z提出了关于.then和类似功能的建议,以便使这种链塌缩变得容易和有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读