在C 中的線程之間傳播異常
當從主線程調用的函數生成多個線程時,就會出現在C 中的執行緒之間傳播異常的任務用於CPU 密集型工作的工作執行緒。挑戰在於處理工作執行緒上可能發生的異常並將其傳播回主執行緒以進行正確處理。
傳統方法
一種常見方法是手動捕獲工作線程上的各種異常,記錄它們的詳細信息,然後在主線程上重新拋出它們。但是,此方法有一個限制,即它僅支援一組固定的異常類型。將來引入的任何新異常類型都需要手動修改程式碼。
C 11 異常處理
C 11 引入了 exception_ptr 類型,提供了更強大的解決方案用於異常傳播。此類型允許在線程之間傳輸異常。
範例實作
以下範例示範如何使用Exception_ptr傳播異常:
#include
#include
#include
#include
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 在此範例中,工作執行緒捕獲發生的任何異常並將其指派給 eptr。在主執行緒上,檢查 eptr,如果存在異常,則重新拋出異常。
多工作線程注意事項
如果有多個工作線程,您需要為每個線程維護單獨的Exception_ptr實例以捕獲任何潛在的異常。
其他注意事項
- exception_ptr是一個共享的類似指針的類型,因此,確保至少有一個exception_ptr 指向每個異常以防止它們被釋放至關重要。
- Microsoft 特定:當使用帶有 /EHa 編譯器標誌的 SEH 異常時,範例程式碼也可能捕獲SEH 異常,例如存取衝突。這可能不適合所有情況。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3