启动Exexecuteonce异常安全
-
26-10-2019 - |
题
我在initonceexecuteonce winapi功能上有一个例外的安全问题。每当出现异常从回调功能僵局中抛弃时。回调返回boolean flag告诉呼叫者数据是否已成功初始化,但是如果我返回false,我将无法重新恢复异常,这不好。我尝试以这种方式解决问题。
try
{
InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
InitOnceInitialize(&flag);
throw;
}
每当我从函数中捕获异常时,我都会再次启动结构并重新启动异常,因此其他线程将发现未初始化的数据,因为标志处于初始状态。但是,有时也会发生僵局,可能是因为其他线程在第一个螺纹再次捕获异常和初始化的标志之前开始等待同步对象。该问题有任何解决方案吗?
提前致谢。
解决方案
您不应通过不期望的代码(例如C代码,或您的情况下的Windows API)进行C ++例外。相反,请您的回调返回错误,这将反映在从 InitOnceExecuteOnce
不隶属于 StackOverflow