c-解锁已解锁的线程



在一个已经在运行的旧代码中,我发现了一个地方,他们试图解锁一个已经解锁的互斥对象。

我很清楚,解锁一个已经解锁的互斥会导致未定义的行为。

但我的疑虑是

  1. 我是否能够通过检查编译器文档来预测行为
  2. 是否有可能导致线程阻塞(死锁)
  3. 在解锁已解锁线程的pthread_mutex_unlock上会看到未定义的行为吗?或者在接下来的任何pthread调用中都可以看到未定义的行为

我是否能够通过检查编译器文档来预测行为?

如果编译器说明了行为,那么如果你使用该编译器(并且它保留了该行为),那么你就可以依赖该行为。

是否有可能导致线程阻塞(死锁)?

是的。UB可以导致任何事情。例如,如果unlock函数无条件地减少锁计数,它可能会下溢,从而使互斥锁永远锁定。

在pthread_mutex_unlock上会看到未定义的行为,它在哪里解锁了已经解锁的线程?或者在接下来的任何pthread调用中都可以看到未定义的行为?

你在问行为是如何定义的。它是未定义的。任何事情都可能在这一点之后的任何时候发生,至少就POSIXpthreads标准而言是这样。除非有其他事情具体说明会发生什么,否则它可能是任何事情,你正式无权抱怨。

最新更新