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
// 使用互斥量实现线程安全异常处理 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!