我知道这有点“违反了规则”,但我正在寻找强制解锁一个互斥锁的选项,可能来自不同的主题。
它可能被认为是某种黑客攻击,因为传统的API可能并不真正支持它,但有没有这样的选项?
对我来说可能有趣的一个场景是,例如,如果需要清理,并且一个线程执行一般清理,但是另一个线程正在处理它锁定的互斥锁,并且它不是一个真正的选项等待该线程释放它。
我正在使用pthread互斥锁。
答案 0 :(得分:1)
您可以使用pthread_mutex_destroy(pthread_mutex_t *mutex)销毁互斥锁。
等待(锁定或trylock)将返回EINVAL
,您可以将其解释为“清理”的分支。注意:此操作后,互斥对象不再有效。但是有一些危险因为:试图破坏锁定的互斥锁导致未定义的行为。未定义的行为是这种意义意味着您必须关注这种特殊情况。但这是你的意图,所以只要你的清理分支正确,只有在确定没有其他线程这样做时才触摸受互斥锁保护的东西。之后一个被破坏的互斥对象可以重新初始化。
答案 1 :(得分:1)
如果您感兴趣的是“清理”,请使用信号量进行锁定 - 您可以随时使用额外的单元来唤醒等待的线程以使其终止。
如果这个过程即将结束,我总是不打扰清理,除非有一些重要的,压倒一切的理由,('清理'valgrind转储不是其中之一:)。
答案 2 :(得分:0)
此处的问题是否与多个线程等待获取特定互斥锁有关。
如果案件是一个持有很长时间的线程。以下应该有所帮助,并且会更清洁。最好是使代码模块化,并检查条件是否可以在持有互斥锁的函数中间进行挽救。
通过检查多个地方的情况,您应该能够最小化保留时间并处理所有相关案件。