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