choice 類別
choice
傳訊區塊是多來源的單一目標區塊,代表與一組來源的控制流程互動。 選擇區塊會等候多個來源的其中一個來產生訊息,而且會傳播產生訊息之來源的索引。
語法
template<
class T
>
class choice: public ISource<size_t>;
參數
T
tuple
型別,表示輸入來源的承載。
成員
公用 Typedefs
名稱 | 描述 |
---|---|
type |
的類型 T 別名。 |
公用建構函式
名稱 | 描述 |
---|---|
choice | 已多載。 建構 choice 傳訊區塊。 |
~choice 解構函式 | choice 終結傳訊區塊。 |
公用方法
名稱 | 描述 |
---|---|
接受 | 接受此 choice 區塊所提供的訊息,並將擁有權轉移給呼叫端。 |
acquire_ref | 取得此 choice 傳訊區塊的參考計數,以防止刪除。 |
消費 | 取用此 choice 傳訊區塊先前提供的訊息,並成功由目標保留,並將擁有權轉移給呼叫端。 |
has_value | 檢查此 choice 傳訊區塊是否已使用 值初始化。 |
index | 將索引傳回至 , tuple 表示傳訊區塊所選取的專案 choice 。 |
link_target | 將目標區塊鏈接至此 choice 傳訊區塊。 |
release | 釋放先前成功的訊息保留。 |
release_ref | 釋放此 choice 傳訊區塊的參考計數。 |
reserve | 保留此 choice 傳訊區塊先前提供的訊息。 |
unlink_target | 從這個 choice 傳訊區塊取消鏈接目標區塊。 |
unlink_targets | 從這個 choice 傳訊區塊取消連結所有目標。 (覆寫 ISource::unlink_targets. |
value | 取得訊息,其索引是由傳訊區塊選取的 choice 訊息。 |
備註
選擇區塊可確保只取用其中一個傳入訊息。
如需詳細資訊,請參閱 異步消息塊。
繼承階層架構
choice
需求
標頭: agents.h
命名空間: concurrency
accept
接受此 choice
區塊所提供的訊息,並將擁有權轉移給呼叫端。
virtual message<size_t>* accept(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
參數
_MsgId
runtime_object_identity
提供物件message
的 。
_PTarget
呼叫 方法之目標區塊的 accept
指標。
傳回值
呼叫端現在擁有其擁有權之訊息的指標。
acquire_ref
取得此 choice
傳訊區塊的參考計數,以防止刪除。
virtual void acquire_ref(_Inout_ ITarget<size_t>* _PTarget);
參數
_PTarget
呼叫這個方法之目標區塊的指標。
備註
這個方法是由 ITarget
在 方法期間 link_target
連結至這個來源的物件所呼叫。
choice
建構 choice
傳訊區塊。
explicit choice(
T _Tuple);
choice(
Scheduler& _PScheduler,
T _Tuple);
choice(
ScheduleGroup& _PScheduleGroup,
T _Tuple);
choice(
choice&& _Choice);
參數
_元
選擇的 tuple
來源。
_PScheduler
Scheduler
物件,在其內會排定 choice
傳訊區塊的傳播工作。
_PScheduleGroup
ScheduleGroup
物件,在其內會排定 choice
傳訊區塊的傳播工作。 所使用的 Scheduler
物件由排程群組所隱含。
_選擇
作為複製來源處的 choice
傳訊區塊。 請注意,原始物件會被遺棄,使其成為移動建構函式。
備註
如果您未指定 _PScheduler
或 _PScheduleGroup
參數,執行階段會使用預設排程器。
移動建構函式不會在鎖定下執行,這表示使用者必須確認在移動時沒有任何輕量工作在執行中。 否則,可能發生許多競爭情況,導致例外狀況或不一致的狀態。
~選擇
choice
終結傳訊區塊。
~choice();
消耗
取用此 choice
傳訊區塊先前提供的訊息,並成功由目標保留,並將擁有權轉移給呼叫端。
virtual message<size_t>* consume(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
參數
_MsgId
runtime_object_identity
保留message
物件的 。
_PTarget
呼叫 方法之目標區塊的 consume
指標。
傳回值
呼叫端現在擁有其擁有權的物件指標 message
。
備註
方法consume
類似於 accept
,但之前一律必須有傳回true
的 reserve
呼叫。
has_value
檢查此 choice
傳訊區塊是否已使用 值初始化。
bool has_value() const;
傳回值
true
如果區塊已收到值,則為 , false
否則為 。
index
將索引傳回至 , tuple
表示傳訊區塊所選取的專案 choice
。
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
runtime_object_identity
要釋放之message
物件的 。
_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
runtime_object_identity
要保留的message
物件的 。
_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
來判斷類型。