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

Bagaimanakah Pengecualian Boleh Disebarkan Antara Benang dalam C?

Linda Hamilton
Lepaskan: 2024-10-31 04:14:02
asal
676 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan