1

我在 InitOnceExecuteOnce WinAPI 函数上有一个异常安全问题。每当从回调函数抛出异常时,就会发生死锁。回调返回布尔标志,告诉调用者数据是否初始化成功,但如果我返回 false 我将无法重新抛出异常,这不好。我试着用这种方式解决了这个问题。

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

每当我从函数中捕获异常时,我都会再次初始化结构并重新抛出异常,因此其他线程会发现未初始化的数据,因为标志处于初始状态。但是,它有时也会死锁,可能是因为其他线程在第一个线程捕获异常并再次初始化标志之前开始等待同步对象。这个问题有什么解决办法吗?

提前致谢。

4

1 回答 1

5

你不应该通过不期望它的代码抛出 C++ 异常(例如 C 代码,或者在你的情况下,Windows API)。相反,让您的回调在错误时返回 false,这将反映在从InitOnceExecuteOnce

于 2011-01-27T18:52:16.617 回答