【问题标题】:On linux, how to make sure to unlock a mutex which was locked in a thread that dies/terminates?在 linux 上,如何确保解锁锁定在死/终止线程中的互斥锁?
【发布时间】:2012-03-01 05:04:43
【问题描述】:

这是一道面试题。

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

我的想法:

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

谢谢

【问题讨论】:

  • 还有更多上下文吗?线程是如何被杀死的?
  • 互斥锁是如何实现的? POSIX 还是 SysV 信号量?

标签: linux multithreading locking mutex


【解决方案1】:

健壮的互斥锁可用于处理互斥锁的所有者在持有互斥锁的同时终止的情况,从而不会发生死锁。它们比常规互斥锁具有更多开销,并且要求所有锁定互斥锁的客户端都准备好处理错误代码EOWNERDEAD。这表明前所有者已经死亡,收到此错误代码的客户端是新所有者,负责清理任何不一致的状态。

健壮互斥体是具有健壮属性集的互斥体。使用 POSIX.1-2008 标准函数 pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST) 设置。

更多细节和示例代码可以在the Linux manual page for pthread_mutexattr_getrobust找到。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我无法在自己的脑海中表达我的想法,但这个问题似乎没有意义。你一针见血,恕我直言。
    • 我想总会有这样的场景:线程干净地退出,但程序员的错误导致互斥锁被锁定。如果可能的话,你当然想从中恢复过来。一定是我还没有做正确的编程类型,因为我从来没有遇到过这种情况。
    • @SanJacinto 你不可能知道这是错误,而不是让受互斥锁保护的数据处于不一致的状态。您必须假设共享数据已损坏。您可以处理这种情况,但它需要代码可以修复共享数据的任何问题,或者在没有共享数据的情况下不尝试和操作(可能通过尽可能干净地关闭并重新启动)。
    • 有一个合理的用例——当互斥锁保护的不是状态本身,而是一些关于状态的元信息时。想象一下多个应用程序处理单个文件 - 文件本身可能以原子方式操作,但要确保每个进程都在最新状态下运行(即当前没有其他进程正在修改文件) - 你需要做一个标准的 R/W 锁。如果有人拿着锁死了 - 就是这样。文件未写入,状态正常。您可以恢复运营。
    • @AndrianNord 当然,但这不太可能有助于回答 OP 提出的问题。问这样一个一般性问题的面试官会对典型用例的答案感兴趣,而不是那些罕见到可能永远不会出现的答案。 (并且该用例存在咨询文件锁。)
    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2019-11-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多