在锁定之前检查Thread是否已锁定互斥锁

时间:2012-02-01 12:43:23

标签: c++ locking mutex

在线程锁定互斥锁之前,我想检查它是否已锁定该互斥锁所以我无法执行此操作

Acquire mutex
Acquire mutex

// do something here

Release mutex

// still has mutex lock at this point!!

我知道我可以在这里使用bool,但想知道某些事情是否已经存在。

感谢。

5 个答案:

答案 0 :(得分:1)

评论太长了,所以道歉这是一个答案..

IMO,任何要求递归锁定的设计都可能会终止鼻守护进程。重新设计代码,以便不必由同一个线程多次获取相同的锁。 IMO一个好的做法是永远不要从其他公共函数(也锁定)调用公共函数(它应该锁定),并且所有私有函数都不应该锁定 - 即它们只能由公共方法(被锁定)调用。 / p>

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

总而言之,如果可以,请避免使用递归互斥锁。

答案 1 :(得分:0)

调查RAII。这会让你不必担心这个问题。

答案 2 :(得分:0)

你使用什么API? 这很重要,因为如果它是Win32 API在一个互斥锁上的一个线程中对WaitForSingleObject进行双重调用,而不必两次调用ReleaseMutex。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果您正在使用win32:

线程获得互斥量的所有权后,可以指定相同的对象 重复调用wait-functions中的互斥体而不会阻塞其 执行。这样可以防止线程在此期间自身死锁 等待它已经拥有的互斥量。释放所有权 在这种情况下,线程必须调用一次ReleaseMutex以便 每次互斥量满足等待功能的条件。

来源:Mutex Objects - Microsoft Documentation