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