Dalam aplikasi berbilang benang, adalah penting untuk mengendalikan pengecualian dengan anggun untuk mengelakkan ranap dan kerosakan data. Satu senario biasa ialah apabila utas utama melahirkan benang pekerja untuk melaksanakan tugas intensif dan menunggu keputusannya. Dalam kes sedemikian, pengecualian yang berlaku dalam utas pekerja harus disebarkan kembali ke utas utama untuk pengendalian yang betul.
Menyebarkan Pengecualian dengan exception_ptr
C 11 memperkenalkan jenis exception_ptr , yang membolehkan pengangkutan pengecualian antara benang. Pertimbangkan contoh berikut:
<code class="cpp">#include <iostream> #include <thread> #include <exception> #include <stdexcept> static std::exception_ptr teptr = nullptr; void f() { try { std::this_thread::sleep_for(std::chrono::seconds(1)); throw std::runtime_error("To be passed between threads"); } catch(...) { teptr = std::current_exception(); } }</code>
Fungsi f() menangkap sebarang pengecualian dan menangkapnya dalam teptr menggunakan std::current_exception().
Mengambil Pengecualian pada Benang Utama
Benang utama mendapatkan semula pengecualian daripada urutan pekerja:
<code class="cpp">std::thread mythread(f); mythread.join(); if (teptr) { try{ std::rethrow_exception(teptr); } catch(const std::exception &ex) { std::cerr << "Thread exited with exception: " << ex.what() << "\n"; } }</code>
Jika pengecualian telah ditangkap (teptr bukan nol), std::rethrow_exception() membuang pengecualian pada urutan utama, membenarkan pemanggil mengendalikannya.
Mengendalikan Berbilang Benang Pekerja
Untuk senario dengan berbilang rangkaian pekerja, anda boleh mempunyai exception_ptr untuk setiap urutan untuk menangkap pengecualian. Selain itu, ambil perhatian bahawa exception_ptr ialah penunjuk yang dikongsi; oleh itu, sekurang-kurangnya satu penuding mesti sentiasa menunjukkan pengecualian untuk mengelakkan pemadaman pramatang.
Awas untuk Pengecualian Khusus Microsoft
Jika menggunakan pengecualian Pengendalian Pengecualian Berstruktur (SEH) , kod contoh juga akan mengangkut pengecualian SEH, yang mungkin tidak diingini.
Atas ialah kandungan terperinci Bagaimanakah saya menyebarkan pengecualian antara benang dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!