1

InitOnceExecuteOnce WinAPI 関数に例外の安全性の問題があります。コールバック関数から例外がスローされるたびにデッドロックが発生します。コールバックは、データが正常に初期化されたかどうかを呼び出し元に伝えるブール値のフラグを返しますが、false を返すと、例外を再スローできなくなります。これは良くありません。私はこの方法で問題を解決しようとしました。

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

関数から例外をキャッチするたびに、構造体をもう一度初期化して例外を再スローするため、フラグが初期状態であるため、他のスレッドは初期化されていないデータを検出します。ただし、最初のスレッドが例外をキャッチしてフラグを再度初期化する前に、他のスレッドが同期オブジェクトを待機し始めたため、デッドロックが発生することもあります。その問題の解決策はありますか?

前もって感謝します。

4

1 に答える 1

5

C++ 例外を想定していないコード (例: C コード、またはあなたの場合は Windows API) を介して C++ 例外をスローしないでください。代わりに、エラー時にコールバックが false を返すようにします。これは、からの戻り値に反映されます。InitOnceExecuteOnce

于 2011-01-27T18:52:16.617 に答える