Rumah >pembangunan bahagian belakang >C++ >Pengaturcaraan serentak C++: Bagaimana untuk menangani pengendalian pengecualian dalam persekitaran berbilang benang?
Panduan Pengendalian Pengecualian C++ Berbilang Benang mencadangkan empat pendekatan utama: Gunakan mutex atau operasi atom untuk memastikan keselamatan benang dalam pengendalian pengecualian. Manfaatkan storan setempat-benang (TLS) untuk menyimpan maklumat pengecualian bagi setiap urutan. Laksanakan tugas tak segerak dan penyebaran pengecualian melalui std::async dan std::future. Kumpul maklumat pengecualian melalui TLS dan utas utama untuk melaksanakan pengendalian pengecualian dalam muat turun fail berbilang benang. . Artikel ini akan memperkenalkan cara mengendalikan pengecualian dalam persekitaran berbilang benang dalam C++ dan menunjukkannya melalui kes praktikal.
Penyegerakan pengecualian dan keselamatan benang
Dalam persekitaran berbilang benang, balingan dan pengendalian pengecualian perlu disegerakkan untuk memastikan tiada perlumbaan data atau kebuntuan berlaku. Anda boleh menggunakan mutex atau operasi atom untuk memastikan keselamatan benang dalam pengendalian pengecualian.// 使用互斥量实现线程安全异常处理 std::mutex m; void handle_error() { std::unique_lock<std::mutex> lock(m); // 处理异常 }
// 使用 TLS 存储每个线程的异常信息 __thread std::exception_ptr exception_ptr; void set_exception(const std::exception& e) { exception_ptr = std::make_exception_ptr(e); }
// 在异步任务中处理异常 auto f = std::async(std::launch::async, []() { try { // 执行任务 } catch (const std::exception& e) { std::cout << "Exception caught in async task: " << e.what() << std::endl; } }); // 在主线程中检查异常 if (f.get()) { std::cout << "Async task completed successfully" << std::endl; } else { std::cout << "Async task failed with exception" << std::endl; }
Kes Praktikal: Muat Turun Fail Berbilang Benang
#include <thread> #include <vector> #include <iostream> #include <fstream> using namespace std; // TLS 存储下载失败的异常信息 __thread exception_ptr exception_ptr; // 下载文件的线程函数 void download_file(const string& url, const string& path) { try { ofstream file(path, ios::binary); // 略:从 URL 下载数据并写入文件 } catch (const exception& e) { exception_ptr = make_exception_ptr(e); } } // 主线程函数 int main() { // 创建下载线程 vector<thread> threads; for (const auto& url : urls) { string path = "file_" + to_string(i) + ".txt"; threads.emplace_back(download_file, url, path); } // 加入线程并收集异常信息 for (auto& thread : threads) { thread.join(); if (exception_ptr) { try { rethrow_exception(exception_ptr); } catch (const exception& e) { cerr << "File download failed: " << e.what() << endl; } } } return 0; }
Melalui kaedah ini, kami boleh mengendalikan pengecualian dengan berkesan dalam persekitaran berbilang benang C++ dan memastikan keteguhan dan kestabilan aplikasi. std::async
和 std::future
Atas ialah kandungan terperinci Pengaturcaraan serentak C++: Bagaimana untuk menangani pengendalian pengecualian dalam persekitaran berbilang benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!