Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya menyebarkan pengecualian antara benang dalam C?

Bagaimanakah saya menyebarkan pengecualian antara benang dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-10-29 07:46:02807semak imbas

How do I propagate exceptions between threads in C  ?

Melintasi Sempadan Benang dengan Pengecualian

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 &amp;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!

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