Robert Love 的 Linux Kernel Development 指出:
A mutex cannot be acquired by an interrupt handler or bottom half, even with mutex_trylock()
在 http://landley.net/kdocs/htmldocs/kernel-locking.html , 它提到了
mutex_trylock() does not suspend your task but returns non-zero if it could lock the mutex on the first try or 0 if not. This function cannot be safely used in hardware or software interrupt contexts despite not sleeping.
不明白为什么不能在不休眠的情况下使用?
最佳答案
想象一下,如果您有一个平台,其原生的低级原始互斥体没有“尝试锁定”操作。在这种情况下,要实现这样的高级互斥锁,您必须使用条件变量和受低级互斥锁保护的 bool 值“已锁定”以指示高级互斥锁已锁定。
因此可以使用低级原始互斥锁(不支持“trylock”操作)来实现可等待互斥锁来实现高级互斥锁(支持)。 “高级互斥量”可以只是受低级互斥量保护的 bool 值。
根据该设计,mutex_lock
将按如下方式实现:
- 获取低级互斥量(这是对原语、实现互斥量的真正锁定操作)。
- 如果持有高级互斥量,则执行条件等待高级互斥量。
- 获取高级互斥锁(只是
locked = true;
)。 - 释放低级互斥量。
mutex_unlock
的实现如下:
- 获取低级互斥量。
- 释放高级互斥量(只是
locked = false;
) - 向条件变量发出信号。
- 释放低级互斥量。
在这种情况下,mutex_trylock
将按如下方式实现:
- 获取低级互斥量。
- 检查是否持有高级互斥量。
- 如果是,释放低级互斥量并返回失败。
- 获取高级互斥量。
- 释放低级互斥量。
- 返回成功。
想象一下,如果我们在第 2 步之后但在第 3 步之前被打断。
关于linux - 为什么在中断中使用 mutex_trylock 不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36815420/