Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我可以选择*不*调用并发::代理::内部运行完成? 这是在微软C++并发API ./p>的上下文中。_C++_Visual C++_Concurrency_Concurrency Runtime_Concrt - Fatal编程技术网

为什么我可以选择*不*调用并发::代理::内部运行完成? 这是在微软C++并发API ./p>的上下文中。

为什么我可以选择*不*调用并发::代理::内部运行完成? 这是在微软C++并发API ./p>的上下文中。,c++,visual-c++,concurrency,concurrency-runtime,concrt,C++,Visual C++,Concurrency,Concurrency Runtime,Concrt,有一个名为agent(在Concurrency命名空间下)的类,它基本上是一个状态机,您可以派生并实现纯虚拟agent::run 现在,您有责任调用agent::start,这将使它处于可运行状态。然后调用agent::wait*,或其任何变体,以实际执行agent::run方法 但是为什么我们必须在体内调用agent::done?我的意思是,显而易见的答案是,agent::wait*将等待,直到发出完成信号或超时已过,但是 设计师们的意图是什么?当agent::run返回时,为什么不让代理进入

有一个名为
agent
(在
Concurrency
命名空间下)的类,它基本上是一个状态机,您可以派生并实现纯虚拟
agent::run

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

但是为什么我们必须在体内调用
agent::done
?我的意思是,显而易见的答案是,
agent::wait
*将等待,直到发出完成信号或超时已过,但是


设计师们的意图是什么?当
agent::run
返回时,为什么不让代理进入“完成”状态?这就是我想知道的。为什么我可以选择不调用
done
?如果超时已过,等待方法会引发异常。

我能看到的唯一原因是它会让您声明您已完成(),然后执行更多您不希望您的消费者必须等待的工作(例如,清理)

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

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;
};
如果您的
do\u 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() */ }
};
模板
类别myagent:公共代理{
私人:
无效调用\u do\u run()
{
静态_cast(此)->do_run();
}
受保护的:
virtual void run()最终重写{/*请参见上面的do_run,但调用_do_run()*/}
};
用于执行编译时分派的CRTP。使用:

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

/耸耸肩

你的第一句话,在不让消费者等待的情况下,暗示了你的愚蠢,真是太棒了。我从来没有想到过。哇,可能性。。。谢谢,这正是我想要的东西。