Freigeben über


choice-Klasse

Ein choice-Meldungsblock ist ein Block mit mehreren Quellen und einem einzelnen Ziel, der eine Kontrollflussinteraktion zwischen mehreren Quellen darstellt. Der Auswahlblock wartet, bis eine von mehreren Quellen eine Meldung erzeugt, und gibt den Index der Quelle, von der die Meldung erzeugt wurde, weiter.

Syntax

template<
    class T
>
class choice: public ISource<size_t>;

Parameter

T
Ein tuple-basierter Typ, der die Nutzlasten der Eingabequellen darstellt.

Member

Öffentliche Typedefs

Name Beschreibung
type Ein Typalias für T.

Öffentliche Konstruktoren

Name Beschreibung
choice Überladen. Erstellt einen choice -Meldungsblock.
~choice Destructor Zerstört den choice Nachrichtenblock.

Öffentliche Methoden

Name Beschreibung
annehmen Akzeptiert eine Nachricht, die von diesem choice Block angeboten wurde, und überträgt den Besitz an den Anrufer.
acquire_ref Dient zum Abrufen einer Verweisanzahl für diesen choice Nachrichtenblock, um das Löschen zu verhindern.
Nutzen Nutzt eine Nachricht, die zuvor von diesem choice Messaging-Block angeboten wurde und erfolgreich vom Ziel reserviert wurde und den Besitz an den Anrufer überträgt.
has_value Überprüft, ob dieser choice Nachrichtenblock mit einem Wert initialisiert wurde.
Index Gibt einen Index in das tuple vom Nachrichtenblock ausgewählte choice Element zurück.
link_target Verknüpft einen Zielblock mit diesem choice Messaging-Block.
release Veröffentlicht eine vorherige erfolgreiche Nachrichtenreservierung.
release_ref Gibt eine Referenzanzahl für diesen choice Messaging-Block frei.
reserve Reserviert eine Nachricht, die zuvor von diesem choice Nachrichtenblock angeboten wurde.
unlink_target Hebt die Verknüpfung eines Zielblocks von diesem choice Nachrichtenblock auf.
unlink_targets Hebt die Verknüpfung aller Ziele von diesem choice Nachrichtenblock auf. (Außerkraftsetzungen ISource::unlink_targets.)
value Ruft die Nachricht ab, deren Index vom choice Nachrichtenblock ausgewählt wurde.

Hinweise

Der Auswahlblock stellt sicher, dass nur eine der eingehenden Nachrichten genutzt wird.

Weitere Informationen finden Sie unter "Asynchrone Nachrichtenblöcke".

Vererbungshierarchie

ISource

choice

Anforderungen

Header: agents.h

Namespace: Parallelität

Akzeptieren

Akzeptiert eine Nachricht, die von diesem choice Block angeboten wurde, und überträgt den Besitz an den Anrufer.

virtual message<size_t>* accept(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parameter

_MsgId
Das runtime_object_identity angebotene message Objekt.

_PTarget
Ein Zeiger auf den Zielblock, der die accept Methode aufruft.

Rückgabewert

Ein Zeiger auf die Nachricht, deren Besitzer der Aufrufer jetzt ist.

acquire_ref

Dient zum Abrufen einer Verweisanzahl für diesen choice Nachrichtenblock, um das Löschen zu verhindern.

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

Parameter

_PTarget
Ein Zeiger auf den Zielblock, der diese Methode aufruft.

Hinweise

Diese Methode wird von einem ITarget Objekt aufgerufen, das während der link_target Methode mit dieser Quelle verknüpft wird.

Option

Erstellt einen choice -Meldungsblock.

explicit choice(
    T _Tuple);

choice(
    Scheduler& _PScheduler,
    T _Tuple);

choice(
    ScheduleGroup& _PScheduleGroup,
    T _Tuple);

choice(
    choice&& _Choice);

Parameter

_Tupel
Ein tuple von Quellen für die Auswahl.

_PScheduler
Das Scheduler -Objekt, in dem die Weiterleitungsaufgabe für den choice -Meldungsblock geplant ist.

_PScheduleGroup
Das ScheduleGroup -Objekt, in dem die Weiterleitungsaufgabe für den choice -Meldungsblock geplant ist. Das verwendete Scheduler -Objekt wird von der Planungsgruppe impliziert.

_Wahl
Ein choice -Meldungsblock, aus dem kopiert werden soll. Beachten Sie, dass das ursprüngliche Objekt verwaist ist, sodass dies ein Bewegungskonstruktor ist.

Hinweise

Die Runtime verwendet das Standardplanungsprogramm, wenn Sie den _PScheduler -Parameter oder den _PScheduleGroup -Parameter nicht angeben.

Bewegungskonstruktion wird bei einer aktiven Sperre nicht ausgeführt, d. h., der Benutzer muss sicherstellen, dass zum Zeitpunkt der Bewegung keine einfachen Aufgaben aktiv sind. Andernfalls können zahlreiche Wettläufe auftreten, wodurch Ausnahmen oder inkonsistente Zuständen verursacht werden.

~Wahl

Zerstört den choice Nachrichtenblock.

~choice();

nutzen

Nutzt eine Nachricht, die zuvor von diesem choice Messaging-Block angeboten wurde und erfolgreich vom Ziel reserviert wurde und den Besitz an den Anrufer überträgt.

virtual message<size_t>* consume(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parameter

_MsgId
Das runtime_object_identity reservierte message Objekt.

_PTarget
Ein Zeiger auf den Zielblock, der die consume Methode aufruft.

Rückgabewert

Ein Zeiger auf das message Objekt, dessen Besitzer der Aufrufer jetzt ist.

Hinweise

Die consume Methode ähnelt accept, muss jedoch immer einem Aufruf dieser reserve zurückgegebenen Methode truevorangestellt werden.

has_value

Überprüft, ob dieser choice Nachrichtenblock mit einem Wert initialisiert wurde.

bool has_value() const;

Rückgabewert

true wenn der Block einen Wert erhalten hat, false andernfalls.

Index

Gibt einen Index in das tuple vom Nachrichtenblock ausgewählte choice Element zurück.

size_t index();

Rückgabewert

Der Nachrichtenindex.

Hinweise

Die Nachrichtennutzlast kann mithilfe der get Methode extrahiert werden.

Verknüpft einen Zielblock mit diesem choice Messaging-Block.

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

Parameter

_PTarget
Ein Zeiger auf einen ITarget Block zum Verknüpfen mit diesem choice Nachrichtenblock.

Freigabe

Veröffentlicht eine vorherige erfolgreiche Nachrichtenreservierung.

virtual void release(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parameter

_MsgId
Das runtime_object_identity Objekt, das message freigegeben wird.

_PTarget
Ein Zeiger auf den Zielblock, der die release Methode aufruft.

release_ref

Gibt eine Referenzanzahl für diesen choice Messaging-Block frei.

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

Parameter

_PTarget
Ein Zeiger auf den Zielblock, der diese Methode aufruft.

Hinweise

Diese Methode wird von einem ITarget Objekt aufgerufen, das von dieser Quelle nicht verknüpft wird. Der Quellblock darf alle Ressourcen freigeben, die für den Zielblock reserviert sind.

Reserve

Reserviert eine Nachricht, die zuvor von diesem choice Nachrichtenblock angeboten wurde.

virtual bool reserve(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parameter

_MsgId
Das runtime_object_identity Objekt, das message reserviert wird.

_PTarget
Ein Zeiger auf den Zielblock, der die reserve Methode aufruft.

Rückgabewert

true wenn die Nachricht erfolgreich reserviert wurde, false andernfalls. Reservierungen können aus vielen Gründen fehlschlagen, einschließlich: Die Nachricht wurde bereits von einem anderen Ziel reserviert oder akzeptiert, die Quelle konnte Vorbehalte verweigern usw.

Hinweise

Nach dem Anruf reservemüssen Sie, falls dies erfolgreich ist, entweder consume anrufen, oder release um den Besitz der Nachricht zu übernehmen oder aufzugeben.

Hebt die Verknüpfung eines Zielblocks von diesem choice Nachrichtenblock auf.

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

Parameter

_PTarget
Ein Zeiger auf einen ITarget Block, um die Verknüpfung von diesem choice Nachrichtenblock aufzuheben.

Hebt die Verknüpfung aller Ziele von diesem choice Nachrichtenblock auf.

virtual void unlink_targets();

Hinweise

Diese Methode muss nicht vom Destruktor aufgerufen werden, da der Destruktor für den internen single_assignment Block die Verknüpfung ordnungsgemäß aufheben wird.

value

Ruft die Nachricht ab, deren Index vom choice Nachrichtenblock ausgewählt wurde.

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

Parameter

_Payload_type
Der Typ der Nachrichtennutzlast.

Rückgabewert

Die Nutzlast der Nachricht.

Hinweise

Da ein choice Messagingblock Eingaben mit unterschiedlichen Nutzlasttypen annehmen kann, müssen Sie den Typ der Nutzlast am Abrufpunkt angeben. Sie können den Typ basierend auf dem Ergebnis der index Methode bestimmen.

Siehe auch

Concurrency-Namespace
join-Klasse
single_assignment-Klasse