Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda menyebarkan pengecualian antara benang dalam C menggunakan `exception_ptr`?

Bagaimanakah anda menyebarkan pengecualian antara benang dalam C menggunakan `exception_ptr`?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 23:15:28582semak imbas

How do you propagate exceptions between threads in C   using `exception_ptr`?

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

  • exception_ptr ialah jenis seperti penuding dikongsi, jadi adalah penting untuk memastikan bahawa sekurang-kurangnya satu exception_ptr menunjuk kepada setiap pengecualian untuk menghalangnya daripada dikeluarkan.
  • Khusus Microsoft: Apabila menggunakan pengecualian SEH dengan bendera pengkompil /EHa, kod contoh mungkin juga menangkap Pengecualian SEH seperti pelanggaran akses. Ini mungkin tidak diingini dalam semua kes.

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!

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