POSIX允许互斥锁递归。这意味着同一个线程可以锁定相同的互斥锁两次,而不会发生死锁。当然,它也需要解锁两次,否则没有其他线程可以获得互斥锁。并非所有支持pthread的系统都支持递归互斥,但是如果他们想要成为POSIX conform, they have to。递归锁(Mutex)与非递归锁(Mutex)
其他API(更高级别的API)通常也提供互斥锁,通常称为Locks。某些系统/语言(例如Cocoa Objective-C)提供递归和非递归互斥。一些语言也只提供一种或另一种。例如。在Java中,互斥量总是递归的(同一个线程可能会在同一个对象上两次“同步”)。根据他们提供的其他线程功能,没有递归互斥可能没有问题,因为它们可以很容易地自己编写(我已经基于更简单的互斥/条件操作自己实现了递归互斥锁)。
我真的不明白什么是非递归互斥体?为什么我想要一个线程死锁,如果它锁定相同的互斥锁两次?即使是能够避免这种情况的高级语言(例如,如果测试会发生死锁并抛出异常,通常也不会这样做)。他们会让线程死锁。
这是唯一的情况下,我不小心锁定它两次,只解锁一次,并在递归互斥体的情况下,它会很难找到问题,所以相反,我立即死锁,看看哪里不正确锁出现?但是我不能在解锁时返回一个锁定计数器,并且在我确定释放了最后一个锁并且计数器不为零的情况下,我可以抛出异常或记录问题吗?还是有没有其他更有用的非递归互斥体的用例,我没有看到?或者它可能只是性能,因为非递归互斥体可能比递归互斥体稍快一些?但是,我测试了这个,差别并不大。
你对非递归互斥的解释听起来更像是一个信号量。互斥体(无论是递归的还是非递归的)都有一个所有权的概念。 – 2011-01-07 22:14:34
@JayD当人们争论这些事情时,这是非常混乱的......所以谁来定义这些东西的实体? – Pacerier 2011-12-08 16:09:52
@Pacerier相关标准。这个答案是例如posix(pthreads)错误,在锁定它的线程以外的其他线程中解锁正常的互斥锁是未定义的行为,而在错误检查或递归互斥体中执行同样的操作则会导致可预测的错误代码。其他系统和标准可能会有很大不同。 – nos 2012-08-06 21:26:39