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.
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