Heim > Backend-Entwicklung > C++ > Wie verbreite ich Ausnahmen zwischen Threads in C?

Wie verbreite ich Ausnahmen zwischen Threads in C?

Patricia Arquette
Freigeben: 2024-10-29 07:46:02
Original
806 Leute haben es durchsucht

How do I propagate exceptions between threads in C  ?

Thread-Grenzen mit Ausnahmen überschreiten

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>
Nach dem Login kopieren

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 &amp;ex)
    {
        std::cerr << "Thread exited with exception: " << ex.what() << "\n";
    }
}</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage