为什么我可以选择*不*调用并发::代理::d一个内部运行
Why do I have the option to *not* call Concurrency::agent::done inside run?
这是在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() */ }
};
允许您执行编译时调度的 CRTP。 用:
class foo: public myagent<foo>
{
public:
void do_run() { /* code */ }
};
。。。/耸肩
相关文章:
- 运行同一解决方案的另一个项目的项目
- 我在c++代码中生成了一个运行时#3异常
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如何创建函数管道,以便函数一个接一个地运行?
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 我在代码中收到一个运行时错误,该错误如何通过修改最多一个元素来查找数组是否可以变得不减少
- 如何从.txt文件创建一个运行平均值为15的值
- 从一个运行多次c++的循环中获取输入
- 仅对指定类型中的一个运行typed_test
- UNIX中两个进程之间通信的最佳方式:一个运行ruby服务器,另一个运行C++客户端
- 我的c++程序读取一个矩阵并打印出非零的数字,这产生了一个运行时错误
- Cuda如何从全局函数运行多个线程?一个运行多个线程的内核
- 如何做一个运行时子类化系统
- 当使用字符串时,c++程序给出一个运行时错误
- 为什么这会给出一个运行时浮点错误
- 如何找到一个运行时效率的c++代码
- 两个几乎相同的C++程序,一个运行良好,但另一个出现运行时错误
- 向量迭代器擦除给我一个运行时错误