【问题标题】:Force mutex unlock (Possibly from a different thread)?强制互斥锁解锁(可能来自不同的线程)?
【发布时间】:2012-10-24 08:44:49
【问题描述】:

我知道这有点“违反规则”,但我正在寻找一种强制解锁互斥锁的选项,可能来自不同的线程。

这可能被认为是某种黑客行为,因为传统 API 可能并不真正支持它,但有这样的选择吗?

我可能会感兴趣的一个场景是,例如,如果需要清理,一个线程执行一般清理,但另一个线程正在处理它锁定的互斥锁,这不是一个真正的选择等待该线程释放它。

我正在使用 pthread 互斥锁。

【问题讨论】:

    标签: locking pthreads mutex unlock


    【解决方案1】:

    您可以使用pthread_mutex_destroy(pthread_mutex_t *mutex) 销毁互斥锁​​。 等待(锁定或尝试锁定)将返回 EINVAL,您可以将其解释为“清理”的分支。注意:此操作后互斥对象不再有效。但是还有一些危险,因为:尝试破坏锁定的互斥体会导致未定义的行为。未定义的行为在这种意义上意味着您必须注意这种特殊情况。但这是你的意图,所以只要你的清理分支正确,只有在确定没有其他线程这样做时才触摸受互斥锁保护的东西。之后可以重新初始化被破坏的互斥对象

    【讨论】:

    • 未定义的行为并不意味着“您必须注意这种特殊情况”。这意味着它可以做任何事情。它可能会杀死你的猫或擦除你的硬盘。您依赖于您的实现的实现细节,该细节可能在其他地方有所不同或随时更改。避开未定义的行为。
    • @KevinCox:问题明确表示这可能是“违反规则”的尝试。您可能会丢失您的猫,或者您可能必须恢复您的硬盘;但是,未定义的行为 可能仍然可以恢复。就像在现实生活中一样:细节确实很重要,并且会为恢复设定规则。
    【解决方案2】:

    如果您只对“清理”感兴趣,请使用信号量进行锁定 - 您始终可以在额外的单元中填充以唤醒等待线程以使其终止。

    如果进程要关闭,无论如何我都不会为清理工作而烦恼,除非有一些重要的、压倒一切的理由(“干净”的 valgrind 转储不是其中之一:)。

    【讨论】:

    • +1 表示信号量,但你如何区分它是正常的“事件”还是“清理”?
    • 先设置一个 'terminateAndExit' 布尔值,然后是信号。在信号量等待返回后检查布尔值。
    【解决方案3】:

    这里的问题是否与等待获取特定互斥锁的多个线程有关。

    如果情况是线程保持了很长时间。以下应该会有所帮助并且会更清洁。如果您可以在持有互斥锁的函数中间退出,最好使代码模块化并检查条件。

    通过检查多个地方的情况,您应该能够最大限度地减少等待时间并处理所有相关情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 2012-12-25
      • 2021-11-07
      • 2012-11-28
      • 2014-05-02
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多