IntonceExecuteOnce例外の安全
-
26-10-2019 - |
質問
IntioneexecuteOnce Winapi関数に例外の安全性の問題があります。コールバック関数のデッドロックから例外がスローされるたびに行われます。 Callbackは、データが正常に初期化されているかどうかを発信者に伝えるブールフラグを返しますが、Falseを返す場合、例外をrethrowにすることができなくなりますが、それは良くありません。このように問題を解決しました。
try
{
InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
InitOnceInitialize(&flag);
throw;
}
関数から例外をキャッチするたびに、構造を再度開始し、例外をrethrowします。そのため、フラグが初期状態にあるため、他のスレッドはデータが初期化されていないことがわかります。ただし、最初のスレッドが例外をキャッチし、再び初期化されたフラグをもう一度キャッチする前に、他のスレッドが同期オブジェクトで待機し始めたため、それは時々デッドロックします。その問題の解決策はありますか?
前もって感謝します。
解決
予期しないコードを介してC ++例外をスローしないでください(例:Cコード、またはWindows API)。代わりに、コールバックのreturn false on errorを使用してください。 InitOnceExecuteOnce
所属していません StackOverflow