Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Pengecualian Boleh Disebarkan Antara Benang dalam C?

Bagaimanakah Pengecualian Boleh Disebarkan Antara Benang dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 04:14:02729semak imbas

How Can Exceptions be Propagated Between Threads in C  ?

Penyebaran Pengecualian Antara Benang

Dalam aplikasi berbilang benang, adalah penting untuk mengendalikan pengecualian yang berlaku dalam rangkaian pekerja tanpa merosakkan keseluruhan aplikasi. Artikel ini meneroka cara menyebarkan pengecualian daripada utas pekerja ke utas utama, membenarkan pemanggil mengendalikannya dengan anggun.

Cabaran Penyebaran Pengecualian

Satu pendekatan naif adalah untuk menangkap pengecualian dalam rangkaian pekerja dan merekodkan jenis dan mesejnya. Walau bagaimanapun, kaedah ini terhad kepada set jenis pengecualian tertentu dan memerlukan pengubahsuaian kod manual apabila menambah pengecualian baharu.

Penyebaran Pengecualian Menggunakan exception_ptr

C 11 memperkenalkan exception_ptr jenis, yang menyediakan cara yang selamat dan fleksibel untuk menyimpan dan mengangkut pengecualian antara benang. Dalam pendekatan ini:

  1. Setiap urutan pekerja menangkap pengecualian dan menyimpannya dalam exception_ptr.
  2. Urut utama menyemak exception_ptrs untuk melihat sama ada sebarang pengecualian berlaku.
  3. Jika pengecualian ditemui, utas utama akan membuangnya semula, membenarkan pemanggil mengendalikannya.

Contoh Kod

<code class="cpp">#include <iostream>
#include <thread>
#include <exception>
#include <stdexcept>

static std::exception_ptr myException;

void f() {
    try {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        throw std::runtime_error("To be passed between threads");
    } catch (...) {
        myException = std::current_exception();  // Store the exception
    }
}

int main() {
    std::thread myThread(f);
    myThread.join();

    if (myException) {
        try {
            std::rethrow_exception(myException);  // Rethrow the exception
        } catch (const std::exception& ex) {
            std::cerr << "Thread exited with exception: " << ex.what() << "\n";
        }
    }

    return 0;
}</code>

Berbilang- Pertimbangan Benang

Dalam senario dengan berbilang urutan pekerja, anda perlu menggunakan tatasusunan exception_ptrs untuk menangkap pengecualian daripada setiap urutan. Selain itu, exception_ptrs ialah petunjuk dikongsi, jadi adalah penting untuk memastikan bahawa sekurang-kurangnya satu exception_ptr menunjuk kepada setiap pengecualian untuk mengelakkan deallokasi pramatang.

Atas ialah kandungan terperinci Bagaimanakah Pengecualian Boleh Disebarkan Antara Benang dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn