2012-02-08 41 views
4

这是一个面试问题。在Linux上,如何确保解锁锁定在死亡/终止线程中的互斥锁?

在Linux上,如何确保解锁POSIX互斥体,该互斥体被锁定在死亡/终止的POSIX线程中?

我的想法:

Linux会自动释放它时,它发送终止或终止信号发送到程序?但是,我无法找到关于操作系统如何操作的更多细节?

谢谢

+0

还有其他的上下文吗?线程如何完全死亡? – Tudor 2012-02-08 18:13:52

+0

互斥体是如何实现的? POSIX或SysV信号量? – 2012-02-08 18:52:23

回答

14

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

健壮的互斥体是一个具有健壮属性集的互斥体。在Linux上,可以使用pthread_mutexattr_setrobust_np(&attr, PTHREAD_MUTEX_ROBUST_NP)或使用POSIX标准函数pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST)来设置,如果您有glibc 2.12或更高版本(此功能在POSIX.1-2008中进行了标准化)。

4

如果它不是一个进程共享的互斥量,那并不重要。当一个线程死亡时,该进程死亡,并且该互斥体消失。

如果它是一个进程共享的互斥量,那么你问的是错误的问题。你不会想要解锁互斥体,如果一个线程死亡,而按住它。线程持有互斥锁的原因是,它可以通过其他线程不能看到的状态来操作共享数据。如果线程在持有互斥锁时死亡,那么数据很可能会处于这种不一致的状态。解锁互斥锁只会让其他线程看到无效/损坏的数据。

+0

我无法在自己的脑海中表达自己的想法,但是对于这个问题似乎没有任何意义。你击中了头部,imho。 – 2012-02-08 19:06:50

+0

我想总有这种情况,当线程干净地退出,但程序员的错误锁定了一个互斥体。如果可能的话,你肯定希望从中恢复过来。这一定是我还没有完成正确的编程类型,因为我从来没有遇到过这种情况。 – 2012-02-09 13:23:45

+0

@SanJacinto你不可能知道这是错误,而不是让互斥锁保护的数据处于不一致的状态。您必须假定共享数据已损坏。您可以处理这种情况,但它需要代码来修复共享数据的任何问题,或者不尝试在没有共享数据的情况下运行(可能尽可能干净地关闭并重新启动)。 – 2012-02-09 22:10:23