InitOnceExecuteOnce异常安全

发布于 2024-10-14 11:54:12 字数 448 浏览 8 评论 0原文

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

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

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

提前致谢。

I have a exception safety issue on InitOnceExecuteOnce WinAPI function. Whenever exception is thrown from callback function deadlock is occurred. Callback returns boolean flag telling the caller whether the data is successfully initialized, but if I return false I will not be able to rethrow exception, that's not good. I tried solved the problem this way.

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

Whenever I catch an exception from function I init the structure once again and rethrow the exception, so other threads will find the data not initialized, as the flag is in initial state. However, it sometimes deadlocks too, possibly because other thread started waiting on the synchronization object before the first one caught the exception and initialized flag once again. Is there any solution to that problem?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陈甜 2024-10-21 11:54:12

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

You should not throw C++ exceptions through code that does not expect it, (eg. C code, or in your case, the Windows API). instead, have your callback return false on error, which will be reflected in the return from InitOnceExecuteOnce

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文