如果一个进程持有一些自旋锁或信号量,并且意外退出(例如,被Linux杀死),那么Linux会正确释放这些锁吗? 如果Linux没有执行此操作,为什么呢?
如果一个进程持有一些自旋锁或信号量,并且意外退出(例如,被Linux杀死),那么Linux会正确释放这些锁吗? 如果Linux没有执行此操作,为什么呢?
sem_*
系列),那么不会被释放,因为没有锁所有权的概念。flock
系列,或fcntl(F_SETLK, ...)
建议性锁定,则当该进程中绑定到文件的任何文件描述符关闭时,它们将自动释放。由于这个原因,在大多数情况下使用flock
是一个坏主意,但是如果进程被杀死,它将被释放。
如果你在谈论一个进程内的pthread_mutex
,那么这个问题就没有意义了,因为当进程终止时,互斥锁也将随之消失。
如果你在谈论一个共享内存段中的共享pthread_mutex
(即使用pthread_mutexattr_setpshared
使其可共享的互斥锁),只有当它同时被标记为强壮互斥锁(使用pthread_mutexattr_setrobust
)时,它才会在进程结束时自动释放。但是,在重新使用之前,必须将其标记为一致;请参阅pthread_mutex_consistent
手册页以获取详细信息。
force_sig
仅绕过用户空间信号忽略;它仍然必须经过所有其他正常处理。这里唯一真正的解决方案是首先修复导致问题的死锁。 - bdonlan