>백엔드 개발 >C++ >C의 스레드 간에 예외가 어떻게 전파될 수 있습니까?

C의 스레드 간에 예외가 어떻게 전파될 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 04:14:02661검색

How Can Exceptions be Propagated Between Threads in C  ?

스레드 간 예외 전파

멀티 스레드 애플리케이션에서는 전체 애플리케이션을 충돌시키지 않고 작업자 스레드에서 발생하는 예외를 처리하는 것이 중요합니다. 이 문서에서는 작업자 스레드에서 기본 스레드로 예외를 전파하여 호출자가 이를 적절하게 처리할 수 있도록 하는 방법을 살펴봅니다.

예외 전파의 과제

한 가지 순진한 접근 방식은 다음과 같습니다. 작업자 스레드에서 예외를 포착하고 해당 유형과 메시지를 기록합니다. 그러나 이 방법은 특정 예외 유형 집합으로 제한되며 새 예외를 추가할 때 수동 코드 수정이 필요합니다.

Exception_ptr을 사용한 예외 전파

C 11에서는 예외_ptr을 도입합니다. 스레드 간에 예외를 저장하고 전송하는 안전하고 유연한 방법을 제공하는 유형입니다. 이 접근 방식에서는 다음과 같습니다.

  1. 각 작업자 스레드는 예외를 포착하여 예외_ptr에 저장합니다.
  2. 메인 스레드는 예외가 발생했는지 확인하기 위해 예외_ptrs를 확인합니다.
  3. 예외가 발견되면 메인 스레드가 이를 다시 발생시켜 호출자가 이를 처리할 수 있도록 합니다.

코드 예

<code class="cpp">#include <iostream>
#include <thread>
#include <exception>
#include <stdexcept>

static std::exception_ptr myException;

void f() {
    try {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        throw std::runtime_error("To be passed between threads");
    } catch (...) {
        myException = std::current_exception();  // Store the exception
    }
}

int main() {
    std::thread myThread(f);
    myThread.join();

    if (myException) {
        try {
            std::rethrow_exception(myException);  // Rethrow the exception
        } catch (const std::exception& ex) {
            std::cerr << "Thread exited with exception: " << ex.what() << "\n";
        }
    }

    return 0;
}</code>

스레드 고려 사항

여러 작업자 스레드가 있는 시나리오에서는 예외_ptr 배열을 사용하여 각 스레드에서 예외를 캡처해야 합니다. 또한 예외_ptr은 공유 포인터이므로 조기 할당 해제를 방지하려면 하나 이상의 예외_ptr이 각 예외를 가리키는지 확인하는 것이 중요합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.