Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verbreiten Sie Ausnahmen zwischen Threads in C mit „Exception_ptr“?

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

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 23:15:28512Durchsuche

How do you propagate exceptions between threads in C   using `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

  • Exception_ptr ist ein gemeinsam genutzter zeigerähnlicher Typ. Daher ist es wichtig sicherzustellen, dass mindestens ein „Exception_ptr“ auf jede Ausnahme verweist, um zu verhindern, dass sie freigegeben wird.
  • Microsoft-spezifisch: Bei Verwendung von SEH-Ausnahmen mit dem /EHa-Compiler-Flag kann der Beispielcode auch erfassen SEH-Ausnahmen wie Zugriffsverletzungen. Dies ist möglicherweise nicht in allen Fällen wünschenswert.

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!

Stellungnahme:
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