在线程锁定互斥锁之前,我想检查它是否已经对互斥锁有了锁,所以我无法执行这个。
Acquire mutex
Acquire mutex
// do something here
Release mutex
// still has mutex lock at this point!!我知道我可以在这里喝一杯,但我想知道是否有什么东西已经存在了。
谢谢。
发布于 2012-02-01 12:50:05
如果您使用的是特定的平台(Win32?)互斥实现-那么您应该查阅该平台的文档。
如果您使用的是C++11标准的mutex - std::mutex,则改用std::recursive_mutex。请注意,对于要锁定()的每个调用,您都需要调用unlock()。
发布于 2012-02-01 13:09:40
太长时间不能发表评论了,所以很抱歉,这是一个回答。
IMO,任何需要递归锁定的设计都有可能结束鼻守护进程。重新设计您的代码,以便同一锁不必被同一线程多次获取。海事组织的一个良好做法是,永远不要从其他公共职能(也锁定)中调用公共职能(应锁定),所有私人职能也不应锁定-即它们只能由公共方法(锁定)调用。
因此,重新组织代码,以便在同一个线程的上下文中调用的方法有一个进入对象的入口点,然后锁定,并且任何后续的私有函数调用都可以在此锁下操作。这种方法有一些缺点(例如,顺序函数调用的多个锁操作-但是如果通过分析证明这是一个瓶颈,那么采用一种模式,通过一个成员公开互斥对象,正如前面提到的一个人在函数调用期间使用RAII锁定该锁)。
总之,如果你能避免递归互斥.
发布于 2012-02-01 12:45:09
调查RAII。这样你就不用担心那个问题了。
https://stackoverflow.com/questions/9096010
复制相似问题