>  기사  >  백엔드 개발  >  `Exception_ptr`을 사용하여 C의 스레드 간에 예외를 어떻게 전파합니까?

`Exception_ptr`을 사용하여 C의 스레드 간에 예외를 어떻게 전파합니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 23:15:28512검색

How do you propagate exceptions between threads in C   using `exception_ptr`?

C에서 스레드 간 예외 전파

C에서 스레드 간 예외 전파 작업은 메인 스레드에서 호출된 함수가 여러 스레드를 생성할 때 발생합니다. CPU 집약적인 작업을 위한 작업자 스레드. 문제는 작업자 스레드에서 발생할 수 있는 예외를 처리하고 적절한 처리를 위해 이를 다시 메인 스레드로 전파하는 것입니다.

기존 접근 방식

한 가지 일반적인 접근 방식은 다음과 같습니다. 작업자 스레드에서 다양한 예외를 수동으로 포착하고 세부 정보를 기록한 다음 기본 스레드에서 다시 발생시킵니다. 그러나 이 방법은 고정된 예외 유형 집합만 지원한다는 제한이 있습니다. 향후에 새로운 예외 유형이 도입되면 코드를 수동으로 수정해야 합니다.

C 11 예외 처리

C 11에서는 더 강력한 솔루션을 제공하는 예외_ptr 유형을 도입합니다. 예외 전파를 위해. 이 유형을 사용하면 스레드 간에 예외를 전송할 수 있습니다.

구현 예

다음 예에서는 예외_ptr을 사용하여 예외를 전파하는 방법을 보여줍니다.

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

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 << "Worker thread exited with exception: " << ex.what() << "\n";
    }
  }

  return 0;
}</code>

이 예에서 작업자 스레드는 발생하는 모든 예외를 포착하고 이를 eptr에 할당합니다. 메인 스레드에서 eptr을 검사하고 예외가 있으면 다시 발생시킵니다.

다중 작업자 스레드에 대한 참고 사항

작업자 스레드가 여러 개 있는 경우 , 잠재적인 예외를 캡처하려면 각 스레드에 대해 별도의 예외_ptr 인스턴스를 유지해야 합니다.

추가 고려 사항

  • Exception_ptr은 공유 포인터와 유사한 유형입니다. 따라서 예외가 해제되는 것을 방지하기 위해 하나 이상의 예외_ptr이 각 예외를 가리키는지 확인하는 것이 중요합니다.
  • Microsoft 관련: /EHa 컴파일러 플래그와 함께 SEH 예외를 사용할 때 예제 코드는 또한 캡처할 수 있습니다. 액세스 위반과 같은 SEH 예외. 이는 모든 경우에 바람직하지 않을 수 있습니다.

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

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