c++ - 为什么我可以选择*不*在运行中调用 Concurrency::agent::done?

标签 c++ visual-c++ concurrency concurrency-runtime concrt

这是在 Microsoft C++ 并发 API 的上下文中。

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

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

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

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

最佳答案

我能看到的唯一原因是它会让你声明你是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_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() */ }
};

让您进行编译时分派(dispatch)的 CRTP。使用:

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

.../耸肩

关于c++ - 为什么我可以选择*不*在运行中调用 Concurrency::agent::done?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13422278/

相关文章:

c++ - Qt/Windows,可调整大小的无框窗口

c - 在 VC 6 中构建源代码时出错

c++ - 找到链接到调试 CRT 的库

java - 线程间通信

c++ - 使用 std::get_time 解析日期/时间字符串需要分隔符?

c++ - 如何在类中分配多维数组?当行 > 列时会抛出错误?

c++ - 网络接口(interface)状态

c++ - 转换为 LPCTSTR 时出现文件复制问题

并发模式帮助 - 扇入并返回结果?

java - 线程中的局部变量是什么?