DEENESPTFRRUARHIKOZHNL
AUTOSAR_EXP_ARAComAPI FIG-cc83f25dbab6ee56 962 × 660 px 2 Release(s)

Figure 6.20: Returning Future with possibly unset result

SHA-256 Inhalts-Fingerabdruck: cc83f25dbab6ee56f521895fc05f20a2e14b86b8cf8f4f2984cb326ed0f64a79
✦ KI-generierte Bildanalyse & technische Beschreibung Modell: gemini-3.8-flash (via agy) · Rezept figure-description@2 · erstellt am 2026-10-07

1. Diagrammtyp & Architektur-Kontext

  • Klassifikation: C++-Code-Listing / Entwurfsmuster-Illustration (Asynchrones Server-Methoden-Pattern via Promise/Future).
  • Architektur-Kontext: AUTOSAR Adaptive Platform, Service-Oriented Communication (ara::com).
  • Funktionaler Zweck: Entkopplung des IPC-/Netzwerk-Dispatchers von langlaufender Applikationslogik bei Methodenaufrufen am Service-Provider. Erlaubt die Rückgabe eines noch unvollständigen Ergebnisses (ara::com::Future) an die Middleware, während die Berechnung asynchron in einem Hintergrundkontext abläuft.

2. Komponenten, Entitäten & Schnittstellen

  • RadarServiceSkeleton: Generierte Basisklasse der Adaptive Service Skeleton API für das Service-Interface RadarService.
  • RadarServiceImpl: Anwenderspezifische Service-Provider-Klasse (public-Vererbung von RadarServiceSkeleton).
  • Adjust(const Position&): Öffentliche Service-Methode. Signatur liefert ara::com::Future<AdjustOutput>, nimmt konstante Referenz auf Position.
  • ara::com::Promise<AdjustOutput>: Synchronisations- und Bereitstellungsobjekt zur Erzeugung des Shared States und Übergabe des Ausgabewertes.
  • ara::com::Future<AdjustOutput>: Konsumenten-Handle für das asynchrone Operationsergebnis, das an den Aufrufer/Middleware zurückgegeben wird.
  • std::thread t: Worker-Thread-Instanz zur asynchronen Ausführung von doAdjustInternal().
  • doAdjustInternal(const Position&): Private interne Berechnungsmethode mit synchroner Rückgabe von AdjustOutput.

3. Dynamisches Verhalten & Sequenzablauf

  1. Methoden-Trigger: Eingehender Methodenaufruf via Middleware (z. B. SOME/IP Request Message Dispatcher) ruft synchron RadarServiceImpl::Adjust() auf.
  2. State-Initialisierung: Promise<AdjustOutput> wird lokal auf dem Stack alloziert; das zugehörige Future wird via promise.get_future() abgegriffen.
  3. Thread-Spawn & Kontextübergabe: Neuer Ausführungskontext (std::thread) wird gestartet. Die Ownership des promise wird via std::move(promise) in den Thread-Closure übergeben; position wird per Referenz gebunden.
  4. Unmittelbare Rückgabe: Adjust() gibt das Future sofort an die Skeleton-Laufzeitumgebung zurück, während der Ergebniswert noch nicht gesetzt ist (unset). Der aufrufende Dispatcher-Thread wird unmittelbar entlastet.
  5. Asynchrone Ergebnisbereitstellung: Der Worker-Thread führt doAdjustInternal() aus und setzt bei Fertigstellung den Rückgabewert via prom.set_value(...).
  6. Meldungsauslösung: Der zugrunde liegende Shared State signalisiert der ara::com-Transportschicht die Verfügbarkeit, woraufhin die Response-Nachricht über das Netzwerk serialisiert und übertragen wird.

4. Normative Relevanz & Entwickler-Hinweise

  • API-Spezifikation (ara::com): Skeleton-Methoden dürfen gemäß AUTOSAR Adaptive Platform entweder bereits evaluierte oder unevaluierte Futures zurückgeben. Der Kommunikations-Stack serialisiert die Antwort erst, wenn der Wert im Shared State vorliegt.
  • Kritische Implementierungsfalle (Listing vs. Production Code):
    • Thread-Lebensdauer: Das Deklarieren von std::thread t als lokale Stack-Variable führt bei Funktionsende ohne t.detach() oder t.join() unmittelbar zum Aufruf von std::terminate(). In Embedded-Systemen müssen Worker-Thread-Pools, Task-Queues oder OS-Tasks (POSIX / QNX Neutrino / Linux RT) genutzt werden.
    • Dangling References: Die Übergabe von position per std::cref(position) in einen separaten Thread ist fehleranfällig, falls die Lebensdauer des Originalobjekts an den Scope des Dispatcher-Calls gebunden ist. Asynchrone Handler müssen Parameter per Value (Move/Copy) erfassen.
  • Fehlerbehandlung: Tritt in doAdjustInternal() ein Fehler auf, muss anstelle von set_value() zwingend set_error() bzw. set_exception() am Promise aufgerufen werden, um der Middleware das Senden eines definierten ApplicationError (SOME/IP Error Response) zu ermöglichen.
  • Plattform-Evolution: Ab R18-11 bzw. R19-03 wurden die plattformspezifischen Typen ara::com::Future und ara::com::Promise konsolidiert und durch ara::core::Future / ara::core::Promise unter Verwendung von ara::core::Result abgelöst.

Zugeordnete Anforderungen

Diese Angaben zeigt der Versions-Explorer.

Aus dem Dokument extrahierter Text & Kontext

Beschriftungen im Schaubild:

1 using namespace ara::com; | 2 | 3 // our implementation of RadarService | 4 class RadarServiceImpl : public RadarServiceSkeleton { | 5 | 6 public: | 7 Future<AdjustOutput> Adjust(const Position& position) | 8 { | 9 Promise<AdjustOutput> promise; | 10 auto future = promise.get_future(); | 11 | 12 // asynchronous call to internal adjust function in a new Thread | 13 std::thread t( | 14 [this] (const Position& pos, Promise prom) { prom.set_value( doAdjustInternal(pos));}, | 15 std::cref(position), std::move(promise)); | 16 | 17 //we return a future, which might be set or not at this point... | 18 return future; | 19 } | 20 | 21 private: | 22 AdjustOutput doAdjustInternal(const Position& position) { | 23 // ... implementation | 24 } | 25 }

Vorkommen in AUTOSAR-Releases (2)

Release Dokument Seite Nr. Bildunterschrift im Dokument
R17-03_R1.1.0 AUTOSAR_EXP_ARAComAPI S. 55 6.16 Figure 6.16: Returning Future with possibly unset result
R17-10_R1.2.0 AUTOSAR_EXP_ARAComAPI S. 59 6.20 Figure 6.20: Returning Future with possibly unset result