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.
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