Heim > Artikel > Backend-Entwicklung > Wie verbreiten Sie Ausnahmen zwischen Threads in C mit „Exception_ptr“?
Ausnahmen zwischen Threads in C weitergeben
Die Aufgabe der Weitergabe 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 Ausnahme_ptr weitergegeben werden:
<code class="cpp">#include <iostream> #include <thread> #include <exception> #include <stdexcept> 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 << "Worker thread exited with exception: " << ex.what() << "\n"; } } return 0; }</code>
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ätzliche Überlegungen
Das obige ist der detaillierte Inhalt vonWie verbreiten Sie Ausnahmen zwischen Threads in C mit „Exception_ptr“?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!