Pregunta

Tengo un problema de seguridad de excepción en la función InitonceExecuteUnce Winapi. Siempre que se produzca la excepción de la función de devolución de llamada? Se produce un punto muerto. La devolución de llamada devuelve la bandera booleana diciéndole a la persona que llama si los datos se inicializan con éxito, pero si devuelvo falso, no podré volver a solucionar la excepción, eso no es bueno. Intenté resolver el problema de esta manera.

try
{
    InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
    InitOnceInitialize(&flag);
    throw;
}

Cada vez que capto una excepción de la función, inicialo la estructura una vez más y vuelvo a retirar la excepción, por lo que otros subprocesos encontrarán los datos no inicializados, ya que el indicador está en estado inicial. Sin embargo, a veces también es un punto muerto, posiblemente porque otro hilo comenzó a esperar el objeto de sincronización antes de que el primero obtuviera la excepción y la bandera inicializada una vez más. ¿Hay alguna solución a ese problema?

Gracias por adelantado.

¿Fue útil?

Solución

No debe lanzar excepciones de C ++ a través del código que no lo espere (por ejemplo, código C, o en su caso, la API de Windows). En su lugar, haga que su devolución de llamada devuelva falso al error, que se reflejará en la devolución de InitOnceExecuteOnce

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top