Operating system 如何/在什么情况下可以在同一线程中多次锁定互斥锁?

Operating system 如何/在什么情况下可以在同一线程中多次锁定互斥锁?,operating-system,mutex,Operating System,Mutex,如果互斥锁可以被线程递归锁定,我不理解它的用法。为什么有人想要递归地锁定互斥锁?在什么情况下他们会使用这个 我不明白互斥的用法 如果可以通过 线 互斥锁用于提供对资源的互斥访问。换句话说,一次只能有一个线程(或“代理”)能够访问资源。因此,如果一个线程已经获取了互斥锁,那么它已经拥有了对资源的独占访问权,因此允许它再次获取互斥锁是无害的 递归互斥仍然很有用,因为它仍然提供独占访问的语义。虽然线程1可以获取它已经拥有的互斥体,但仍然阻止线程2获取互斥体并与线程1同时访问资源 为什么会有人想要递归地

如果互斥锁可以被线程递归锁定,我不理解它的用法。为什么有人想要递归地锁定互斥锁?在什么情况下他们会使用这个

我不明白互斥的用法 如果可以通过 线

互斥锁用于提供对资源的互斥访问。换句话说,一次只能有一个线程(或“代理”)能够访问资源。因此,如果一个线程已经获取了互斥锁,那么它已经拥有了对资源的独占访问权,因此允许它再次获取互斥锁是无害的

递归互斥仍然很有用,因为它仍然提供独占访问的语义。虽然线程1可以获取它已经拥有的互斥体,但仍然阻止线程2获取互斥体并与线程1同时访问资源

为什么会有人想要递归地 锁定互斥锁


为了方便起见:如果我的线程访问几个不同类中的资源,那么每个类都可以独立地以嵌套方式获取和释放互斥体,而不必担心彼此。这可能被视为懒惰或设计拙劣,但与非递归互斥锁相比,这是一个优势,当线程试图获取其已拥有的互斥锁时,非递归互斥锁会导致死锁。

您似乎在询问可重入锁的可能用例。一种是使用某个对象的回调。您可能有一个方法,该方法锁定一个对象,然后调用其他对象,从而提供一个访问该对象的回调。如果在此对象上调用另一个方法,它可能还希望获得锁。它们都有锁是非常安全的,不可能同时运行,它们在同一线程中。

+1回答得好。同样有趣的是,递归互斥并不总是可能/支持的。上次我检查了不能在Linux内核中递归锁定互斥锁。我不确定这是个好主意。对于Windows:是的,请参阅@Sam Post:您指的是内核空间中使用的互斥体吗?@Seamus:是的,我指的是内核中的互斥体。显然,pthread等实现了递归互斥,但您可能在驱动程序或文件系统中使用的内核互斥通常不是递归的