检查线程在锁定之前是否已经锁定了互斥对象

Check to see if Thread has already locked mutex before locking

本文关键字:锁定 对象 是否 线程 检查      更新时间:2023-10-16

在线程锁定互斥之前,我想检查它是否已经锁定了该互斥,所以我不能这样做

Acquire mutex
Acquire mutex
// do something here
Release mutex
// still has mutex lock at this point!!

我知道我可以在这里使用bool,但我想知道是否已经存在某种东西。

谢谢。

评论太长,很抱歉这是一个答案。。

IMO,任何要求递归锁定的设计都可能终结鼻守护进程。重新设计代码,这样同一个锁就不必被同一个线程多次获取。IMO一个好的做法是永远不要从其他公共函数(也应该锁定)调用公共函数(应该锁定),所有私有函数都不应该锁定——也就是说,它们只能由公共方法(被锁定)调用。

因此,重新组织您的代码,使在同一线程的上下文中调用的方法有一个进入对象的入口点,然后对象就会锁定,并且任何后续的私有函数调用都可以在该锁定下操作。这种方法有一些缺点(例如,顺序函数调用的多个锁操作-但如果通过分析证明这是一个瓶颈,那么就采用一种模式,通过成员公开互斥,正如一个人提到的那样,在函数调用期间已经使用RAII锁定该锁。)

总而言之,如果可以的话,请避免递归互斥。。。

如果您使用的是特定的平台(Win32?)互斥实现,那么您应该查阅该平台的文档。

如果您使用的是C++11标准互斥-std::互斥,请改用std::recursive_mutex。请注意,每次调用lock()都需要调用unlock()。

调查RAII。那样你就不用担心那个问题了。

您使用什么API?这一点很重要,因为如果是Win32 API在一个互斥对象上的一个线程中对WaitForSingleObject的双重调用,则不必调用ReleaseMutex两次。

然而,这无论如何都是有风险的代码

如果您正在使用win32:

线程获得互斥对象的所有权后,可以指定相同的在不阻塞其处决这样可以防止线程在等待它已经拥有的互斥对象。释放其所有权在这种情况下,线程必须为调用ReleaseMutex一次每次互斥对象满足等待函数的条件时。

来源:Mutex Objects-Microsoft文档