> 백엔드 개발 > C++ > C의 스레드 간에 예외를 어떻게 전파합니까?

C의 스레드 간에 예외를 어떻게 전파합니까?

Patricia Arquette
풀어 주다: 2024-10-29 07:46:02
원래의
807명이 탐색했습니다.

How do I propagate exceptions between threads in C  ?

예외로 스레드 경계 건너기

멀티 스레드 애플리케이션에서는 충돌과 데이터 손상을 방지하기 위해 예외를 적절하게 처리하는 것이 중요합니다. 일반적인 시나리오 중 하나는 메인 스레드가 작업자 스레드를 생성하여 집중적인 작업을 수행하고 그 결과를 기다리는 경우입니다. 이러한 경우 적절한 처리를 위해 작업자 스레드 내에서 발생하는 예외를 기본 스레드로 다시 전파해야 합니다.

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 &amp;ex)
    {
        std::cerr << "Thread exited with exception: " << ex.what() << "\n";
    }
}</code>
로그인 후 복사

예외가 캡처된 경우(teptr이 null이 아님) std::rethrow_Exception()은 호출자가 이를 처리할 수 있도록 기본 스레드에서 예외를 처리합니다.

여러 작업자 스레드 처리

여러 작업자 스레드가 있는 시나리오의 경우 각 스레드에 대해Exception_ptr을 가질 수 있습니다. 예외를 캡처합니다. 또한 예외_ptr은 공유 포인터입니다. 따라서 조기 삭제를 방지하려면 최소한 하나의 포인터가 항상 예외를 가리켜야 합니다.

Microsoft 관련 예외에 대한 주의

SEH(구조적 예외 처리) 예외를 사용하는 경우 , 예제 코드는 바람직하지 않을 수 있는 SEH 예외도 전송합니다.

위 내용은 C의 스레드 간에 예외를 어떻게 전파합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿