"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo se propagan excepciones entre subprocesos en C++ usando `exception_ptr`?

¿Cómo se propagan excepciones entre subprocesos en C++ usando `exception_ptr`?

Publicado el 2024-11-06
Navegar:165

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

Propagar excepciones entre subprocesos en C

La tarea de propagar excepciones entre subprocesos en C surge cuando una función llamada desde un subproceso principal genera múltiples subprocesos de trabajo para trabajos que requieren un uso intensivo de la CPU. El desafío radica en manejar las excepciones que pueden ocurrir en los subprocesos de trabajo y propagarlas nuevamente al subproceso principal para un manejo adecuado.

Enfoque convencional

Un enfoque común es detecte manualmente una variedad de excepciones en subprocesos de trabajo, registre sus detalles y vuelva a generarlas en el subproceso principal. Sin embargo, este método tiene la limitación de que solo admite un conjunto fijo de tipos de excepción. Cualquier nuevo tipo de excepción introducido en el futuro requeriría una modificación manual del código.

C 11 Manejo de excepciones

C 11 introduce el tipo excepción_ptr, lo que proporciona una solución más sólida para la propagación de excepciones. Este tipo permite el transporte de excepciones entre subprocesos.

Ejemplo de implementación

El siguiente ejemplo demuestra cómo propagar excepciones usandoException_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 

En este ejemplo, el subproceso de trabajo detecta cualquier excepción que se produzca y la asigna a eptr. En el subproceso principal, se comprueba el eptr y, si hay una excepción, se vuelve a iniciar.

Nota para varios subprocesos de trabajo

Si tiene varios subprocesos de trabajo , deberá mantener instancias de excepción_ptr separadas para cada subproceso para capturar posibles excepciones.

Consideraciones adicionales

  • exception_ptr es un tipo similar a un puntero compartido, por lo que es fundamental garantizar que al menos un excepción_ptr apunte a cada excepción para evitar que se publiquen.
  • Específico de Microsoft: cuando se utilizan excepciones SEH con el indicador del compilador /EHa, el código de ejemplo también puede capturar Excepciones SEH como violaciones de acceso. Es posible que esto no sea deseable en todos los casos.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3