2012-03-26 123 views
1

首先,我测试了它,它运行良好。 我想知道它是否正确。使用“扔”而不释放互斥锁在win32中安全吗?

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

    ReleaseMutex(mutex); 
} 

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

谢谢

+0

如果您从同一个线程中conicually调用funcA(),那么这是预期的行为 - 因为Windows互斥量是递归的,所以返回WAIT_OBJECT_0。如果您第二次从另一个线程调用funcA(),我期望该调用会阻塞,直到第一个线程释放互斥量。 – 2012-03-26 12:34:37

+0

你说得对。我使用xmlrpc库,我认为有多个线程处理请求,但只有一个线程。所以,这是预期的行为,我的Mutex是不必要的! :) – Sean 2012-03-26 15:41:51

回答

1

不,互斥体不会被释放。

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

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

+1

也ATom CComAutoCriticalSection和CComCriticalSectionLock。 – selbie 2012-03-26 15:49:14

1

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