linux - 为什么在中断中使用 mutex_trylock 不安全?

标签 linux multithreading linux-kernel locking interrupt-handling

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 将按如下方式实现:

  1. 获取低级互斥量(这是对原语、实现互斥量的真正锁定操作)。
  2. 如果持有高级互斥量,则执行条件等待高级互斥量。
  3. 获取高级互斥锁(只是 locked = true;)。
  4. 释放低级互斥量。

mutex_unlock 的实现如下:

  1. 获取低级互斥量。
  2. 释放高级互斥量(只是locked = false;)
  3. 向条件变量发出信号。
  4. 释放低级互斥量。

在这种情况下,mutex_trylock 将按如下方式实现:

  1. 获取低级互斥量。
  2. 检查是否持有高级互斥量。
  3. 如果是,释放低级互斥量并返回失败。
  4. 获取高级互斥量。
  5. 释放低级互斥量。
  6. 返回成功。

想象一下,如果我们在第 2 步之后但在第 3 步之前被打断。

关于linux - 为什么在中断中使用 mutex_trylock 不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36815420/

相关文章:

linux - Shell 函数 - 命令调用后不活动

linux - 在 Linux 上部署 sliver light 应用程序

c++ - 退出应用程序时安全退出 Qt 线程

multithreading - 由于另一个 QThread,QApplication 线程卡住

linux - pthread_create 在执行 2 小时后因 EAGAIN 失败

Linux I2C 内核驱动绑定(bind)

c - 如何正确使用_syscall3

linux - 我如何找出 w/YUM 或 RPM 安装了哪些文件?

java - 使用同步方法测试两个线程递增单个int的结果令人困惑

c - 驱动程序函数不会在 c 中执行,但其他函数会执行