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

c – 为什么我可以选择* not *在运行中调用Concurrency :: agent

发布时间:2020-12-16 07:33:31 所属栏目:百科 来源:网络整理
导读:这是在Microsoft C Concurrency API的上下文中. 有一个叫做agent的类(在Concurrency namespace下),它基本上是你派生并实现纯虚拟代理:: run的状态机. 现在,您有责任调用agent :: start,这将使其处于可运行状态.然后,您可以调用agent :: wait *或其任何变体来
这是在Microsoft C Concurrency API的上下文中.

有一个叫做agent的类(在Concurrency namespace下),它基本上是你派生并实现纯虚拟代理:: run的状态机.

现在,您有责任调用agent :: start,这将使其处于可运行状态.然后,您可以调用agent :: wait *或其任何变体来实际执行agent :: run方法.

但为什么我们必须在体内调用agent :: done?我的意思是,明显的答案是agent :: wait *会等到完成信号或超时已经过去,但……

设计师有什么打算?当agent :: run返回时,为什么不让代理进入完成状态?这就是我想知道的.为什么我可以选择不调用完成?如果超时已过,则等待方法会抛出异常.

解决方法

关于我能看到的唯一原因是,它会让你说你已完成(),然后做更多的工作(比方说,清理),你不希望你的消费者必须等待.

现在,他们可以做到这一点:

private: void agent::do_run() {
  run();
  if (status() != agent_done)
    done();
}

然后让他们的框架直接调用do_run()而不是run()(或等效的).

但是,你会注意到你自己可以做到这一点.

class myagent: public agent {
protected:
  virtual void run() final override { /* see do_run above,except call do_run in it */ }
  virtual void do_run() = 0;
};

和poof,如果你的do_run()无法调用done(),包装函数会为你做.如果第二个虚函数开销对您来说太高:

template<typename T>
class myagent: public agent {
private:
  void call_do_run()
  {
    static_cast<T*>(this)->do_run();
  }
protected:

  virtual void run() final override { /* see do_run above,but call_do_run() */ }
};

CRTP,它允许您进行编译时调度.使用:

class foo: public myagent<foo>
{
public:
  void do_run() { /* code */ }
};

…… /耸肩

(编辑:李大同)

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

    推荐文章
      热点阅读