【问题标题】:Is it safe to use "throw" without releasing Mutex in win32?在 win32 中不释放 Mutex 的情况下使用“throw”是否安全?
【发布时间】:2012-03-26 12:28:53
【问题描述】:

首先,我对其进行了测试,它运行良好。 我想知道它是否正确。

funcA() {  
    DWORD res = WaitForSingleObject(mutex, INFINITE);
    if (aaa != bbb) throw "aaa";

    ReleaseMutex(mutex);
}

WaitForSingleObject 始终返回“0”,而不是“WAIT_ABANDONED”或任何其他错误代码。 我只是找不到任何描述 Mutex 将在“抛出”时发布的文档。

谢谢

【问题讨论】:

  • 如果您从同一个线程连续调用 funcA() 则这是预期的行为 - WAIT_OBJECT_0 被返回,因为 Windows 互斥体是递归的。如果您第二次从不同的线程调用 funcA(),我希望调用会阻塞,直到第一个线程释放互斥锁。
  • 你是对的。我正在使用 xmlrpc 库,我认为有多个线程用于处理请求,但只有一个线程。所以,这是预期的行为,我的 Mutex 是不必要的! :)

标签: winapi mutex throw


【解决方案1】:

不,互斥量不会在抛出时释放。

但是,您可以构建自己的Lock 类,将互斥锁锁定在构造函数上,并在其析构函数上释放它。然后,如果您在函数中使用Lock 对象(使用内存堆栈,而不是堆),则可以确保调用该对象的析构函数并释放互斥锁。

这正是 CSingleLock 类在 MFC 中所做的。

【讨论】:

  • ATL 中还有 CComAutoCriticalSection 和 CComCriticalSectionLock。
【解决方案2】:

除非在析构函数或 catch 块中隐式调用释放,否则不会。您是否展示了描述它所需的全部代码?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2017-09-16
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多