Frage

Ich habe ein Ausnahmesicherheitsproblem in der InitonceExecuteonce WinAPI -Funktion. Wann immer Ausnahme aus der Rückruffunktion ist, tritt Deadlock auf. Callback gibt das Boolean -Flag zurück, in dem der Anrufer angegeben ist, ob die Daten erfolgreich initialisiert werden. Wenn ich jedoch Falsch zurücksuche, kann ich keine Ausnahme überdenken, das ist nicht gut. Ich habe versucht, das Problem auf diese Weise zu lösen.

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

Immer wenn ich eine Ausnahme von der Funktion erfasse, initiere ich die Struktur erneut und überdenken die Ausnahme, sodass andere Threads die nicht initialisierten Daten finden, da sich das Flag im Anfangszustand befindet. Es ist jedoch auch manchmal auch Deadlocks, möglicherweise weil ein anderer Thread auf das Synchronisationsobjekt wartete, bevor die erste die Ausnahme erhielt und die Flagge erneut initialisierte. Gibt es eine Lösung für dieses Problem?

Danke im Voraus.

War es hilfreich?

Lösung

Sie sollten keine C ++ - Ausnahmen durch Code werfen, die dies nicht erwarten (z. B. C -Code oder in Ihrem Fall die Windows -API). Lassen Sie stattdessen Ihren Rückruf bei der Rückrufrückgabe bei Fehler falsch machen, was sich in der Rückkehr von aus widerspiegelt InitOnceExecuteOnce

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top