Question

J'ai un problème de sécurité d'exception sur la fonction InitOnceExecuteOnce WinAPI. Chaque fois exception est levée de blocage de la fonction de rappel est produite. Callback retourne indicateur booléen indiquant l'appelant si les données est initialisé avec succès, mais si je retourne faux je ne serai pas en mesure de réémettre exception, ce n'est pas bon. J'ai essayé résolu le problème de cette façon.

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

Chaque fois que je prends une exception de la fonction I la structure une fois init encore et réémettre l'exception, donc les autres threads trouver les données non initialisées, comme le drapeau est dans l'état initial. Cependant, il DEADLOCKS parfois trop, peut-être parce autre thread a commencé en attente sur l'objet de synchronisation avant la première prise l'exception et le drapeau initialisés encore une fois. Y at-il une solution à ce problème?

Merci à l'avance.

Était-ce utile?

La solution

Vous ne devez pas jeter les exceptions C par code qui ne s'y attend pas, (par exemple. Le code C ou dans votre cas, l'API Windows). à la place, demandez à votre retour de rappel faux en cas d'erreur, qui sera reflété dans le retour de InitOnceExecuteOnce

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top