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 訊息。

備註

選擇區塊可確保只取用其中一個傳入訊息。

如需詳細資訊,請參閱 非同步消息塊

繼承階層架構

ISource

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 傳訊區塊。

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 ,但之前一律必須有傳回 truereserve 呼叫。

has_value

檢查此 choice 傳訊區塊是否已使用 值初始化。

bool has_value() const;

傳回值

true 如果區塊已收到值,則為 , false 否則為 。

index

將索引傳回至 , tuple 表示傳訊區塊所選取的專案 choice

size_t index();

傳回值

訊息索引。

備註

您可以使用 方法擷 get 取訊息承載。

將目標區塊連結至此 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 之後,如果成功,您必須呼叫 consumerelease ,才能分別取得或放棄訊息的擁有權。

從這個 choice 傳訊區塊取消連結目標區塊。

virtual void unlink_target(_Inout_ ITarget<size_t>* _PTarget);

參數

_PTarget
要從這個 choice 傳訊區塊取消連結之區塊的指標 ITarget

從這個 choice 傳訊區塊取消連結所有目標。

virtual void unlink_targets();

備註

此方法不需要從解構函式呼叫,因為內部 single_assignment 區塊的解構函式將會正確連結。

value

取得訊息,其索引是由傳訊區塊選取的 choice 訊息。

template <
    typename _Payload_type
>
_Payload_type const& value();

參數

_Payload_type
訊息承載的類型。

傳回值

訊息的承載。

備註

因為 choice 傳訊區塊可以接受具有不同類型承載的輸入,因此您必須在擷取時指定承載的類型。 您可以根據 方法的結果 index 來判斷類型。

另請參閱

concurrency 命名空間
join 類別
single_assignment 類別