1

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

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

例如,对我来说可能很有趣的一种情况是,如果需要清理,一个线程执行一般清理,但另一个线程正在处理它锁定的互斥锁,这不是等待的真正选择那个线程来释放它。

我正在使用 pthread 互斥锁。

4

3 回答 3

1

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

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

于 2012-10-24T14:53:37.157 回答
1

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

于 2012-10-24T09:06:25.720 回答
0

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

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

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

于 2012-10-24T19:51:50.093 回答