我在InitOnceExecuteOnce WinAPI函数上遇到异常安全问题。每当从回调函数抛出异常时,就会发生死锁。回调返回boolean标志告诉调用者数据是否成功初始化,但是如果我返回false,我将无法重新抛出异常,这不好。我尝试过这样解决问题。
try
{
InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
InitOnceInitialize(&flag);
throw;
}
每当我从函数中捕获异常时,我再次初始化结构并重新抛出异常,因此其他线程将发现数据未初始化,因为标志处于初始状态。但是,它有时也会死锁,可能是因为其他线程在第一个捕获异常并再次初始化标志之前开始等待同步对象。有没有解决这个问题的方法?
提前致谢。
答案 0 :(得分:5)
您不应该通过不期望它的代码抛出C ++异常(例如,C代码,或者在您的情况下,Windows API)。相反,让你的回调在出错时返回false,这将反映在InitOnceExecuteOnce