InitOnceExecuteOnce异常安全

axe*_*axe 1 c++ winapi initialization exception-safety

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

try
{
    InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
    InitOnceInitialize(&flag);
    throw;
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Has*_*kun 5

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

  • @axe:如果你不能保证,那就享受你的僵局.如果你想避免死锁,在回调函数中捕获异常,在某处保存异常(例如使用context参数),并返回错误代码.如果`InitOnceExecuteOnce`返回该错误代码,请抓取保存的异常副本并重新抛出它. (2认同)