In Multithread-Anwendungen ist es unerlässlich, Ausnahmen ordnungsgemäß zu behandeln, um Abstürze und Datenbeschädigungen zu verhindern. Ein häufiges Szenario besteht darin, dass ein Hauptthread Arbeitsthreads zur Ausführung intensiver Aufgaben erzeugt und auf deren Ergebnisse wartet. In solchen Fällen sollten Ausnahmen, die innerhalb der Arbeitsthreads auftreten, zur ordnungsgemäßen Behandlung zurück an den Hauptthread weitergegeben werden.
Ausnahmen mit „Exception_ptr“ weitergeben
C 11 führte den Typ „Exception_ptr“ ein , was den Transport von Ausnahmen zwischen Threads ermöglicht. Betrachten Sie das folgende Beispiel:
<code class="cpp">#include <iostream> #include <thread> #include <exception> #include <stdexcept> static std::exception_ptr teptr = nullptr; void f() { try { std::this_thread::sleep_for(std::chrono::seconds(1)); throw std::runtime_error("To be passed between threads"); } catch(...) { teptr = std::current_exception(); } }</code>
Die Funktion f() fängt jede Ausnahme ab und erfasst sie in teptr mithilfe von std::current_Exception().
Abrufen von Ausnahmen im Hauptthread
Der Hauptthread ruft die Ausnahme vom Arbeitsthread ab:
<code class="cpp">std::thread mythread(f); mythread.join(); if (teptr) { try{ std::rethrow_exception(teptr); } catch(const std::exception &ex) { std::cerr << "Thread exited with exception: " << ex.what() << "\n"; } }</code>
Wenn eine Ausnahme erfasst wurde (teptr ist ungleich Null), löst std::rethrow_Exception() die Ausnahme aus Ausnahme im Hauptthread, sodass der Aufrufer damit umgehen kann.
Umgang mit mehreren Worker-Threads
Für Szenarien mit mehreren Worker-Threads können Sie für jeden Thread einen Ausnahme_ptr haben um Ausnahmen zu erfassen. Beachten Sie außerdem, dass „Exception_ptr“ ein gemeinsam genutzter Zeiger ist. Daher muss immer mindestens ein Zeiger auf eine Ausnahme zeigen, um ein vorzeitiges Löschen zu verhindern.
Achtung für Microsoft-spezifische Ausnahmen
Bei Verwendung von SEH-Ausnahmen (Structured Exception Handling). , transportiert der Beispielcode auch SEH-Ausnahmen, was möglicherweise nicht wünschenswert ist.
Das obige ist der detaillierte Inhalt vonWie verbreite ich Ausnahmen zwischen Threads in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!