猿问

递归锁定(互斥锁)与非递归锁定(互斥锁)

递归锁定(互斥锁)与非递归锁定(互斥锁

POSIX允许互斥锁递归。这意味着同一个线程可以锁定相同的互斥锁两次并且不会死锁。当然它还需要解锁两次,否则没有其他线程可以获得互斥锁。并非所有支持pthread的系统都支持递归互斥锁,但如果它们想要符合POSIX,则必须使用

其他API(更高级别的API)通常也提供互斥锁,通常称为锁定。一些系统/语言(例如Cocoa Objective-C)提供递归和非递归互斥体。有些语言也只提供一种或另一种语言。例如,在Java中,互斥锁总是递归的(同一个线程可能在同一个对象上“同步”两次)。根据它们提供的其他线程功能,没有递归互斥体可能没有问题,因为它们可以很容易地自己编写(我已经在更简单的互斥/条件操作的基础上自己实现了递归互斥锁)。

我真的不明白:什么是非递归互斥量有用?如果它锁定相同的互斥锁两次,为什么我想要一个线程死锁?即使是可以避免这种情况的高级语言(例如测试它是否会死锁并抛出异常)通常也不会这样做。他们会让线程陷入僵局。

这只适用于我意外锁定它两次并且只解锁一次的情况,并且在递归互斥锁的情况下,它会更难找到问题,所以相反我立即死锁以查看错误锁定出现在哪里?但是我不能在解锁时返回一个锁定计数器,在某种情况下,我确定我已经释放了最后一个锁并且计数器不为零,我可以抛出异常或记录问题吗?或者是否有其他更有用的非递归互斥体用例我看不到?或者它可能只是性能,因为非递归互斥体可能比递归互斥体略快?但是,我对此进行了测试,差异确实不大。


繁花不似锦
浏览 1110回答 3
3回答
随时随地看视频慕课网APP
我要回答