最佳答案
POSIX 允许互斥对象递归。这意味着同一个线程可以锁同一个互斥锁两次,而且不会死锁。当然,它还需要解锁两次,否则没有其他线程可以获得互斥量。并不是所有支持pthread的系统都支持递归互斥对象,但是如果它们想要POSIX符合,他们必须. xml。
其他api(更高级的api)通常也提供互斥对象,通常称为锁。一些系统/语言(例如Cocoa Objective-C)同时提供递归和非递归互斥。有些语言也只提供其中一种。例如,在Java中,互斥锁总是递归的(同一个线程可以两次“同步”同一个对象)。取决于它们提供的其他线程功能,没有递归互斥对象可能不是问题,因为它们可以很容易地自己编写(我自己已经在更简单的互斥对象/条件操作的基础上实现了递归互斥对象)。
我不明白的是:非递归互斥对象有什么好处?如果线程两次锁定同一个互斥锁,为什么我想要线程死锁呢?即使是可以避免这种情况的高级语言(例如测试它是否会死锁,如果会死锁则抛出异常)通常也不会这样做。它们会让线程死锁。
这只是在情况下,我不小心锁定它两次,只解锁它一次,在递归互斥的情况下,它会更难找到问题,所以我让它立即死锁,看看错误的锁出现在哪里?但是我不能做同样的事情,在解锁时有一个锁计数器返回,在我确信我释放了最后一个锁并且计数器不为零的情况下,我可以抛出一个异常或记录问题吗?或者还有其他我没有看到的更有用的非递归互斥的用例吗?或者可能只是性能上的问题,因为非递归互斥量比递归互斥量稍微快一点?然而,我测试了这个,差异真的没有那么大。