检查线程在锁定之前是否已经锁定了互斥对象
Check to see if Thread has already locked mutex before locking
在线程锁定互斥之前,我想检查它是否已经锁定了该互斥,所以我不能这样做:
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文档
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 在锁定下清除STD ::映射,而移动到临时对象
- C 删除对象,是否锁定
- 某人如何在一个线程中锁定多个对象
- 同时锁定两个互斥对象
- 如何在同一个线程上用同一个互斥对象锁定两次
- 如果其对象在多个线程中运行,我们是否需要锁定类成员功能
- C++11线程挂起锁定互斥对象
- 何时使用c++类锁定互斥对象
- C++,有没有办法锁定对象本身
- C++(可能还有 Java)如何锁定对象以进行同步
- 像 C# 一样在 Qt 中锁定对象
- 通过私有互斥锁锁定对象的最佳方法是什么
- 在linux上的C/C++中,我如何创建一个预锁定的互斥对象
- 如何为多线程访问实现类锁定对象
- 检查线程在锁定之前是否已经锁定了互斥对象
- 为什么condition_variable没有等待函数,它不重新锁定互斥对象
- 如果一个堆叠的协同程序锁定了一个互斥对象,然后就屈服了,该怎么办
- 锁定shared_ptr对象