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

时间:2012-02-08 17:55:18

标签: linux multithreading locking mutex

这是一个面试问题。

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

我的想法:

Linux会在向程序发送终止或终止信号时自动释放它吗?但是,我找不到有关操作系统如何执行此操作的更多详细信息?

谢谢

2 个答案:

答案 0 :(得分:13)

健壮的互斥锁可用于处理在持有互斥锁时终止互斥锁的所有者的情况,从而不会发生死锁。这些开销比常规互斥锁具有更多开销,并且要求锁定互斥锁的所有客户端都准备好处理错误代码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中标准化)。

答案 1 :(得分:3)

如果它不是进程共享的互斥锁,则无关紧要。当一个线程死亡时,进程就会死掉,互斥锁就会消失。

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