„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie verbreiten Sie Ausnahmen zwischen Threads in C++ mit „Exception_ptr“?

Wie verbreiten Sie Ausnahmen zwischen Threads in C++ mit „Exception_ptr“?

Veröffentlicht am 06.11.2024
Durchsuche:518

How do you propagate exceptions between threads in C   using `exception_ptr`?

Propagieren von Ausnahmen zwischen Threads in C

Die Aufgabe des Propagierens von Ausnahmen zwischen Threads in C entsteht, wenn eine von einem Hauptthread aufgerufene Funktion mehrere erzeugt Worker-Threads für CPU-intensive Arbeit. Die Herausforderung besteht darin, Ausnahmen zu behandeln, die in den Arbeitsthreads auftreten können, und sie zur ordnungsgemäßen Behandlung an den Hauptthread zurückzuleiten.

Konventioneller Ansatz

Ein gängiger Ansatz ist Fangen Sie manuell verschiedene Ausnahmen in Arbeitsthreads ab, zeichnen Sie deren Details auf und lösen Sie sie erneut im Hauptthread aus. Allerdings weist diese Methode eine Einschränkung auf, da sie nur einen festen Satz von Ausnahmetypen unterstützt. Alle in Zukunft eingeführten neuen Ausnahmetypen würden eine manuelle Änderung des Codes erfordern.

C 11 Ausnahmebehandlung

C 11 führt den Typ „Exception_ptr“ ein und bietet eine robustere Lösung für die Ausnahmeweitergabe. Dieser Typ ermöglicht den Transport von Ausnahmen zwischen Threads.

Beispielimplementierung

Das folgende Beispiel zeigt, wie Ausnahmen mithilfe von „Exception_ptr“ weitergegeben werden:

#include 
#include 
#include 
#include 

static std::exception_ptr eptr;

void worker() {
  try {
    // Simulated CPU-intensive work with a delay
    std::this_thread::sleep_for(std::chrono::seconds(1));
    throw std::runtime_error("Exception in worker thread");
  } catch (...) {
    eptr = std::current_exception();
  }
}

int main() {
  // Create a worker thread
  std::thread workerThread(worker);
  workerThread.join();

  // Check if an exception occurred on the worker thread
  if (eptr) {
    try {
      // Rethrow the exception on the main thread
      std::rethrow_exception(eptr);
    } catch (const std::exception &ex) {
      // Handle the exception on the main thread
      std::cerr 

In diesem Beispiel fängt der Arbeitsthread jede auftretende Ausnahme ab und weist sie eptr zu. Im Hauptthread wird der eptr überprüft und bei Vorliegen einer Ausnahme erneut ausgelöst.

Hinweis für mehrere Worker-Threads

Wenn Sie mehrere Worker-Threads haben , müssen Sie für jeden Thread separate Ausnahme_ptr-Instanzen verwalten, um mögliche Ausnahmen zu erfassen.

Zusätzlich Überlegungen

  • Exception_ptr ist ein gemeinsamer zeigerartiger Typ, daher ist es wichtig sicherzustellen, dass mindestens ein Ausnahme_ptr auf jede Ausnahme zeigt, um zu verhindern, dass sie freigegeben wird.
  • Microsoft-spezifisch: Bei Verwendung von SEH-Ausnahmen mit dem Compiler-Flag /EHa kann der Beispielcode auch SEH-Ausnahmen wie Zugriffsverletzungen erfassen. Dies ist möglicherweise nicht in allen Fällen wünschenswert.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3