这是在 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/