在linux上,如何确保解锁死机/终止线程中锁定的互斥锁?

在linux上,如何确保解锁死机/终止线程中锁定的互斥锁?,linux,multithreading,locking,mutex,Linux,Multithreading,Locking,Mutex,这是一个面试问题 在linux上,如何确保解锁被锁定在死机/终止的POSIX线程中的POSIX互斥锁 我的想法是: Linux会在向程序发送终止或终止信号时自动释放它吗?但是,我找不到更多关于操作系统如何做到这一点的细节 谢谢如果它不是进程共享互斥,那没关系。当一个线程死亡时,进程死亡,互斥锁消失 如果是进程共享互斥,那么你问的问题就错了。如果线程在持有互斥锁时死机,则不希望解锁互斥锁。线程持有互斥锁的原因是,它可以通过其他线程不能看到的状态操作共享数据。如果线程在持有互斥锁时死亡,则数据很可能

这是一个面试问题

在linux上,如何确保解锁被锁定在死机/终止的POSIX线程中的POSIX互斥锁

我的想法是:

Linux会在向程序发送终止或终止信号时自动释放它吗?但是,我找不到更多关于操作系统如何做到这一点的细节


谢谢

如果它不是进程共享互斥,那没关系。当一个线程死亡时,进程死亡,互斥锁消失


如果是进程共享互斥,那么你问的问题就错了。如果线程在持有互斥锁时死机,则不希望解锁互斥锁。线程持有互斥锁的原因是,它可以通过其他线程不能看到的状态操作共享数据。如果线程在持有互斥锁时死亡,则数据很可能处于不一致的状态。解锁互斥锁只会让其他线程看到无效/损坏的数据。

可以使用健壮互斥锁来处理在持有互斥锁时终止互斥锁所有者的情况,从而不会发生死锁。与常规互斥锁相比,这些互斥锁的开销更大,并且要求所有锁定互斥锁的客户端都准备好处理错误代码
EOWNERDEAD
。这表示前所有者已死亡,接收此错误代码的客户端是新所有者,负责清除任何不一致的状态

健壮互斥体是具有健壮属性集的互斥体。它是使用POSIX.1-2008标准功能设置的


更多详细信息和示例代码可在上找到。

是否还有其他上下文?线程是如何被杀死的?互斥锁是如何实现的?POSIX或SysV信号量?我无法在自己的头脑中表达我的想法,但这个问题似乎有点不合理。你一针见血,伊姆霍。我想总有这样一种情况:线程完全退出,但程序员的错误导致互斥锁被锁定。如果可能的话,你肯定想从中恢复过来。这一定是因为我还没有完成正确类型的编程,因为我从未遇到过这种情况。@SanJacinto与让互斥对象保护的数据处于不一致的状态不同,您无法知道这是错误所在。您必须假设共享数据已损坏。您可以处理这种情况,但它需要的代码既可以修复共享数据的任何问题,也可以不尝试在没有共享数据的情况下运行(可能是通过尽可能干净地关闭并重新启动)。有一种情况是合理的-当互斥锁不保护状态本身时,但是一些关于国家的元信息。想象一下,许多应用程序在一个文件上工作——文件本身可能以原子方式运行,但为了确保每个进程都在最新状态下运行(即,当前没有其他进程在修改文件)——您需要创建一个标准的R/W锁。如果拿着锁的人死了,那就是它。文件未写入,状态正常。您可以继续您的操作。@AndrianNord当然可以,但这不太可能有助于回答OP提出的问题。问这样一个一般性问题的面试官会对典型用例的答案感兴趣,而不是那些很少出现的用例。(该用例存在建议文件锁。)