멀티 스레드 애플리케이션에서는 충돌과 데이터 손상을 방지하기 위해 예외를 적절하게 처리하는 것이 중요합니다. 일반적인 시나리오 중 하나는 메인 스레드가 작업자 스레드를 생성하여 집중적인 작업을 수행하고 그 결과를 기다리는 경우입니다. 이러한 경우 적절한 처리를 위해 작업자 스레드 내에서 발생하는 예외를 기본 스레드로 다시 전파해야 합니다.
Exception_ptr을 사용하여 예외 전파
C 11에서는 예외_ptr 유형을 도입했습니다. , 스레드 간 예외 전송을 가능하게 합니다. 다음 예를 고려하십시오.
<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>
f() 함수는 모든 예외를 포착하고 std::current_Exception()을 사용하여 teptr에서 이를 캡처합니다.
메인 스레드에서 예외 검색
메인 스레드는 작업자 스레드에서 예외를 검색합니다.
<code class="cpp">std::thread mythread(f); mythread.join(); if (teptr) { try{ std::rethrow_exception(teptr); } catch(const std::exception &ex) { std::cerr << "Thread exited with exception: " << ex.what() << "\n"; } }</code>
예외가 캡처된 경우(teptr이 null이 아님) std::rethrow_Exception()은 호출자가 이를 처리할 수 있도록 기본 스레드에서 예외를 처리합니다.
여러 작업자 스레드 처리
여러 작업자 스레드가 있는 시나리오의 경우 각 스레드에 대해Exception_ptr을 가질 수 있습니다. 예외를 캡처합니다. 또한 예외_ptr은 공유 포인터입니다. 따라서 조기 삭제를 방지하려면 최소한 하나의 포인터가 항상 예외를 가리켜야 합니다.
Microsoft 관련 예외에 대한 주의
SEH(구조적 예외 처리) 예외를 사용하는 경우 , 예제 코드는 바람직하지 않을 수 있는 SEH 예외도 전송합니다.
위 내용은 C의 스레드 간에 예외를 어떻게 전파합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!