質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top