"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > `Exception_ptr`을 사용하여 C++의 스레드 간에 예외를 어떻게 전파합니까?

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

2024-11-06에 게시됨
검색:769

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

C에서 스레드 간 예외 전파

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

기존 접근 방식

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

C 11 예외 처리

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

구현 예

다음 예에서는 예외_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을 확인하고 예외가 있으면 다시 발생합니다.

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

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

추가 고려 사항

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

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3