マルチスレッド C++ 例外処理ガイドでは、4 つの主要なアプローチを提案しています: ミューテックスまたはアトミック操作を使用して、例外処理におけるスレッドの安全性を確保します。スレッドローカル ストレージ (TLS) を利用して、各スレッドの例外情報を保存します。 std::async および std::future を介して非同期タスクと例外の伝播を実装します。 TLS とメイン スレッドを通じて例外情報を収集し、マルチスレッド ファイル ダウンロードでの例外処理を実装します。
マルチスレッド環境では、予期しない状況が発生したときにアプリケーションが正常に実行できるようにするため、例外処理が特に重要です。この記事では、C++ のマルチスレッド環境で例外を処理する方法を紹介し、実際のケースを通じてそれを示します。
マルチスレッド環境では、データ競合やデッドロックが発生しないように、例外のスローと処理を同期する必要があります。ミューテックスまたはアトミック操作を使用して、例外処理におけるスレッドの安全性を確保できます。
// 使用互斥量实现线程安全异常处理 std::mutex m; void handle_error() { std::unique_lock<std::mutex> lock(m); // 处理异常 }
スレッド ローカル ストレージ (TLS) は、スレッドごとに個別のストレージ領域を提供し、例外情報など、そのスレッドに固有のデータを保存できます。
// 使用 TLS 存储每个线程的异常信息 __thread std::exception_ptr exception_ptr; void set_exception(const std::exception& e) { exception_ptr = std::make_exception_ptr(e); }
マルチスレッド環境では、例外が 1 つのスレッドから別のスレッドに伝播される可能性があります。 std::async
和 std::future
を使用すると、タスクを非同期に実行し、スレッドでスローされた例外を処理できます。
// 在异步任务中处理异常 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; }
各スレッドがファイルの一部のダウンロードを担当するマルチスレッド ファイル ダウンロード アプリケーションを考えてみましょう。例外を処理するには、TLS を使用してダウンロードの失敗に関する例外情報を保存し、この情報をメイン スレッドで収集します。
#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; }
これらのメソッドを通じて、C++ マルチスレッド環境で例外を効果的に処理し、アプリケーションの堅牢性と安定性を確保できます。
以上がC++ 同時プログラミング: マルチスレッド環境での例外処理をどのように処理するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。