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

这是一个面试问题。

在Linux上,如何确保解锁locking在POSIX线程死亡/终止的POSIX互斥锁

我的想法:

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

谢谢

Solutions Collecting From Web of "在Linux上,如何确保解锁locking在死亡/终止的线程中的互斥锁?"

强大的互斥锁可用于处理互斥锁的拥有者在持有互斥锁的情况下终止的情况,从而不会发生死锁。 这些比普通的互斥锁有更多的开销,并要求锁定互斥锁的所有客户端都准备好处理错误代码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中标准化))来设置。

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

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