罗伯特·洛夫(Robert Love)的Linux内核开发指出:
即使使用mutex_trylock(),也无法通过中断处理程序或下半部分获取互斥锁
在http://landley.net/kdocs/htmldocs/kernel-locking.html上,它提到
Mutex_trylock()不会挂起您的任务,但如果可以在第一次尝试时锁定互斥锁,则返回非零值,否则返回0。尽管未休眠,但无法在硬件或软件中断上下文中安全使用此功能。
我不明白为什么在不睡觉的情况下不能使用它?
想象一下,如果您有一个平台,其本地低级原始互斥锁没有“尝试锁定”操作。在这种情况下,要实现一个高级互斥锁,必须使用条件变量,并使用一个由低级互斥锁保护的布尔值“被锁定”,以指示高级互斥锁已被锁定。
因此,可以使用低级原始互斥锁(不支持“ trylock”操作)来实现可等待的互斥锁,以实现高级互斥锁(可以)。“高级互斥锁”可以是受低级互斥锁保护的布尔值。
通过这种设计,mutex_lock
将实现如下:
locked = true;
)。而mutex_unlock
将实施如下:
locked = false;
)在这种情况下,mutex_trylock
将按以下方式实施:
想象一下,如果我们在步骤2之后但在步骤3之前被打断了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句