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

用户名

罗伯特·洛夫(Robert Love)的Linux内核开发指出:

即使使用mutex_trylock(),也无法通过中断处理程序或下半部分获取互斥锁

http://landley.net/kdocs/htmldocs/kernel-locking.html上,它提到

Mutex_trylock()不会挂起您的任务,但如果可以在第一次尝试时锁定互斥锁,则返回非零值,否则返回0。尽管未休眠,但无法在硬件或软件中断上下文中安全使用此功能。

我不明白为什么在不睡觉的情况下不能使用它?

大卫·施瓦兹(David Schwartz)

想象一下,如果您有一个平台,其本地低级原始互斥锁没有“尝试锁定”操作。在这种情况下,要实现一个高级互斥锁,必须使用条件变量,并使用一个由低级互斥锁保护的布尔值“被锁定”,以指示高级互斥锁已被锁定。

因此,可以使用低级原始互斥锁(不支持“ trylock”操作)来实现可等待的互斥锁,以实现高级互斥锁(可以)。“高级互斥锁”可以是受低级互斥锁保护的布尔值。

通过这种设计,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之前被打断了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

为什么数组中的值不安全?

来自分类Dev

为什么PHP认为使用系统时区“不安全”?

来自分类Dev

为什么对路径中的目录使用'-execdir'操作不安全?

来自分类Dev

为什么这不安全?

来自分类Dev

为什么`Rc`线程不安全?

来自分类Dev

为什么sql命令不安全?

来自分类Dev

为什么MAVLink协议不安全?

来自分类Dev

为什么sigwait()MT安全,但sigsuspend()不安全?

来自分类Dev

什么是“漫游MAC地址”,为什么它不安全?

来自分类Dev

为什么在不安全的情况下将localhost添加到SAN列表中?

来自分类Dev

python:*为什么*使用python的字符串操作组装sqlite查询不安全?

来自分类Dev

为什么使用隐式意图启动服务并不安全?

来自分类Dev

Lua为什么“要求”在沙盒环境中使用不安全?

来自分类Dev

为什么在无人机中使用Java不安全?

来自分类Dev

为什么使用隐式意图启动服务并不安全?

来自分类Dev

为什么删除旧内核是不安全的?

来自分类Dev

为什么Generics.Collections.TObjectList.List不安全?

来自分类Dev

为什么将strncpy标记为不安全?

来自分类Dev

为什么SHA-1被认为是不安全的?

来自分类Dev

C-为什么该程序不安全?

来自分类Dev

为什么将组可写目录视为不安全?

来自分类Dev

为什么基于MAC的身份验证不安全?

来自分类Dev

为什么删除旧内核是不安全的?

来自分类Dev

为什么会话ID cookie不安全

来自分类Dev

为什么mktemp -u被认为是“不安全的”?

来自分类Dev

无锁并发示例;为什么不安全?

来自分类Dev

为什么数组协方差不安全?

来自分类Dev

为什么使用不安全的查询:Delete语句不带任何位置会清除表中的所有数据?

Related 相关文章

  1. 1

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

  2. 2

    为什么数组中的值不安全?

  3. 3

    为什么PHP认为使用系统时区“不安全”?

  4. 4

    为什么对路径中的目录使用'-execdir'操作不安全?

  5. 5

    为什么这不安全?

  6. 6

    为什么`Rc`线程不安全?

  7. 7

    为什么sql命令不安全?

  8. 8

    为什么MAVLink协议不安全?

  9. 9

    为什么sigwait()MT安全,但sigsuspend()不安全?

  10. 10

    什么是“漫游MAC地址”,为什么它不安全?

  11. 11

    为什么在不安全的情况下将localhost添加到SAN列表中?

  12. 12

    python:*为什么*使用python的字符串操作组装sqlite查询不安全?

  13. 13

    为什么使用隐式意图启动服务并不安全?

  14. 14

    Lua为什么“要求”在沙盒环境中使用不安全?

  15. 15

    为什么在无人机中使用Java不安全?

  16. 16

    为什么使用隐式意图启动服务并不安全?

  17. 17

    为什么删除旧内核是不安全的?

  18. 18

    为什么Generics.Collections.TObjectList.List不安全?

  19. 19

    为什么将strncpy标记为不安全?

  20. 20

    为什么SHA-1被认为是不安全的?

  21. 21

    C-为什么该程序不安全?

  22. 22

    为什么将组可写目录视为不安全?

  23. 23

    为什么基于MAC的身份验证不安全?

  24. 24

    为什么删除旧内核是不安全的?

  25. 25

    为什么会话ID cookie不安全

  26. 26

    为什么mktemp -u被认为是“不安全的”?

  27. 27

    无锁并发示例;为什么不安全?

  28. 28

    为什么数组协方差不安全?

  29. 29

    为什么使用不安全的查询:Delete语句不带任何位置会清除表中的所有数据?

热门标签

归档