Menyebarkan Pengecualian Antara Benang dalam C
Tugas menyebarkan pengecualian antara benang dalam C timbul apabila fungsi yang dipanggil daripada utas utama menghasilkan berbilang benang pekerja untuk kerja intensif CPU. Cabarannya terletak pada pengendalian pengecualian yang mungkin berlaku pada utas pekerja dan menyebarkannya kembali ke utas utama untuk pengendalian yang betul.
Pendekatan Konvensional
Satu pendekatan biasa ialah dengan menangkap pelbagai pengecualian secara manual pada benang pekerja, merekodkan butirannya dan membuangnya semula pada utas utama. Walau bagaimanapun, kaedah ini mempunyai had kerana ia hanya menyokong set tetap jenis pengecualian. Sebarang jenis pengecualian baharu yang diperkenalkan pada masa hadapan akan memerlukan pengubahsuaian manual kepada kod.
C 11 Pengendalian Pengecualian
C 11 memperkenalkan jenis exception_ptr, memberikan penyelesaian yang lebih mantap untuk penyebaran pengecualian. Jenis ini membenarkan pengangkutan pengecualian antara urutan.
Contoh Pelaksanaan
Contoh berikut menunjukkan cara menyebarkan pengecualian menggunakan exception_ptr:
<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>
Dalam contoh ini, benang pekerja menangkap sebarang pengecualian yang berlaku dan menyerahkannya kepada eptr. Pada utas utama, eptr disemak dan, jika terdapat pengecualian, ia dilemparkan semula.
Nota untuk Berbilang Benang Pekerja
Jika anda mempunyai berbilang rangkaian pekerja , anda perlu mengekalkan kejadian exception_ptr yang berasingan untuk setiap urutan untuk menangkap sebarang kemungkinan pengecualian.
Pertimbangan Tambahan
Atas ialah kandungan terperinci Bagaimanakah anda menyebarkan pengecualian antara benang dalam C menggunakan `exception_ptr`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!