choice 消息块是多源、单目标的块,表示与一组源进行的控制流交互。 choice 块将等待多个源中的任何一个源以生成消息,并将传播生成该消息的源的索引。
语法
template<
class T
>
class choice: public ISource<size_t>;
参数
T
一种基于 tuple 的类型,表示输入源的有效负载。
成员
公共 Typedef
| 名称 | 描述 |
|---|---|
type |
T 的类型别名。 |
公共构造函数
| 名称 | 描述 |
|---|---|
| choice | 已重载。 构造 choice 消息块。 |
| ~choice 析构函数 | 销毁 choice 消息块。 |
公共方法
| 名称 | 描述 |
|---|---|
| accept | 接受此 choice 块提供的消息,将所有权转移给调用方。 |
| acquire_ref | 获取此 choice 消息块的引用计数,以防止删除。 |
| 使用 | 使用此 choice 消息块之前提供且由目标成功保留的消息,并将所有权转让给调用方。 |
| has_value | 检查是否已使用值初始化此 choice 消息块。 |
| 索引 | 返回表示 choice 消息块所选元素的 tuple 的索引。 |
| link_target | 将目标块链接到此 choice 消息块。 |
| release | 释放之前成功保留的消息。 |
| release_ref | 释放此 choice 消息块的引用计数。 |
| reserve | 保留此 choice 消息块之前提供的消息。 |
| unlink_target | 取消此 choice 消息块与目标块的链接。 |
| unlink_targets | 取消此 choice 消息块与所有目标的链接。 (重写 ISource::unlink_targets。) |
| value | 获取 choice 消息块选择其索引的消息。 |
备注
choice 块可确保只使用其中一条传入消息。
有关详细信息,请参阅异步消息块。
继承层次结构
choice
要求
标头: agents.h
命名空间: 并发
接受
接受此 choice 块提供的消息,将所有权转移给调用方。
virtual message<size_t>* accept(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
参数
_MsgId
提供的 message 对象的 runtime_object_identity。
_PTarget
指向正在调用 accept 方法的目标块的指针。
返回值
指向调用方现在对其拥有所有权的消息的指针。
acquire_ref
获取此 choice 消息块的引用计数,以防止删除。
virtual void acquire_ref(_Inout_ ITarget<size_t>* _PTarget);
参数
_PTarget
指向正在调用此方法的目标块的指针。
注解
此方法由 ITarget 对象调用,该对象在使用 link_target 方法期间链接到此源。
选项
构造 choice 消息块。
explicit choice(
T _Tuple);
choice(
Scheduler& _PScheduler,
T _Tuple);
choice(
ScheduleGroup& _PScheduleGroup,
T _Tuple);
choice(
choice&& _Choice);
参数
_Tuple
choice 的源的 tuple 。
_PScheduler
在其中计划了 Scheduler 消息块的传播任务的 choice 对象。
_PScheduleGroup
在其中计划了 ScheduleGroup 消息块的传播任务的 choice 对象。 所用 Scheduler 对象由该计划组提示。
_Choice
要从中进行复制的 choice 消息块。 请注意原始对象是孤立的,使之成为一个移动构造函数。
备注
如果未指定 _PScheduler 或 _PScheduleGroup 函数,运行时将使用默认的计划程序。
在锁定状态下不执行移动构造,这意味着应由用户确保在移动期间没有轻量任务处于飞行状态。 否则可能会发生大量争用,从而导致异常或不一致的状态。
~choice
销毁 choice 消息块。
~choice();
使用
使用此 choice 消息块之前提供且由目标成功保留的消息,并将所有权转让给调用方。
virtual message<size_t>* consume(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
参数
_MsgId
保留的 message 对象的 runtime_object_identity。
_PTarget
指向正在调用 consume 方法的目标块的指针。
返回值
指向调用方现在对其拥有所有权的 message 对象的指针。
备注
consume 方法类似于 accept,但必须始终在对 reserve 进行调用(返回 true)之前使用。
has_value
检查是否已使用值初始化此 choice 消息块。
bool has_value() const;
返回值
如果此块已接收一个值,则为 true;否则为 false。
索引
返回表示 choice 消息块所选元素的 tuple 的索引。
size_t index();
返回值
消息索引。
备注
可以使用 get 方法提取消息有效负载。
link_target
将目标块链接到此 choice 消息块。
virtual void link_target(_Inout_ ITarget<size_t>* _PTarget);
参数
_PTarget
指向要链接到此 choice 消息块的 ITarget 块的指针。
发布
释放之前成功保留的消息。
virtual void release(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
参数
_MsgId
正在释放的 message 对象的 runtime_object_identity。
_PTarget
指向正在调用 release 方法的目标块的指针。
release_ref
释放此 choice 消息块的引用计数。
virtual void release_ref(_Inout_ ITarget<size_t>* _PTarget);
参数
_PTarget
指向正在调用此方法的目标块的指针。
备注
此方法由 ITarget 对象调用,正在取消该对象与此源的链接。 源块可以释放为目标块保留的任何资源。
reserve
保留此 choice 消息块之前提供的消息。
virtual bool reserve(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
参数
_MsgId
正在保留的 message 对象的 runtime_object_identity。
_PTarget
指向正在调用 reserve 方法的目标块的指针。
返回值
如果已成功保留该消息,则为 true;否则,为 false。 预留可能因为众多原因失败,包括:消息已预留或已由另一目标接受,源可能拒绝预留等。
注解
调用 reserve 后,如果成功,则必须调用 consume 或 release,以便获取或放弃消息所有权。
unlink_target
取消此 choice 消息块与目标块的链接。
virtual void unlink_target(_Inout_ ITarget<size_t>* _PTarget);
参数
_PTarget
指向要取消与此 choice 消息块的链接的 ITarget 块的指针。
unlink_targets
取消此 choice 消息块与所有目标的链接。
virtual void unlink_targets();
备注
不需要从析构函数调用此方法,因为内部 single_assignment 块的析构函数将正确取消链接。
value
获取 choice 消息块选择其索引的消息。
template <
typename _Payload_type
>
_Payload_type const& value();
参数
_Payload_type
消息有效负载的类型。
返回值
消息的有效负载。
备注
因为 choice 消息块可以采用不同负载类型的输入,您必须指定检索时的负载类型。 可以根据 index 方法的结果确定类型。