【发布时间】:2012-08-10 08:08:16
【问题描述】:
在 2010 年对问题 Automatically release mutex on crashes in Unix 的评论中,jilles 声称:
glibc 强大的互斥锁是如此之快,因为 glibc 采用了危险的捷径。当内核将其标记为“将导致 EOWNERDEAD”时,不能保证互斥锁仍然存在。如果互斥锁被销毁并且内存被一个内存映射文件替换,该文件恰好在正确的位置包含最后拥有线程的 ID,并且最后一个拥有线程在写入锁定字之后终止(但在从其列表中完全删除互斥锁之前)拥有的互斥体),文件已损坏。 Solaris 和即将成为 FreeBSD9 的健壮互斥体较慢,因为它们不想冒这个风险。
我无法理解这种说法,因为销毁互斥锁是不合法的,除非它被解锁(因此不在任何线程的健壮列表中)。我也找不到任何搜索此类错误/问题的参考。声明是否完全错误?
我问及感兴趣的原因是,这与我自己基于相同 Linux 健壮互斥原语构建的实现的正确性有关。
【问题讨论】:
-
omg,错误名称中有 NERD
-
似乎旧的基于 VMA 的方法至少存在一些问题; kernel.org/doc/Documentation/robust-futexes.txt 。但是,如果我正确阅读它,该列表将保留在用户空间内存中 - 那么如果该内存已损坏,您该怎么办?虽然这可能只是被视为破坏共享内存的一种特殊情况。
-
是的,我看到如果进程运行异常并破坏它们,列表甚至互斥体内容可能会损坏。这是描述的问题吗?当有权访问互斥锁的进程调用未定义的行为时,我不担心确保正确的行为;我只是担心在使用健壮的互斥锁时可能会出现一些竞争条件。
-
我想是我自己想出来的,但我很乐意将赏金奖励给任何有兴趣提供有关该主题的更多信息的人。