2

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

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

但我的疑问是

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

1 回答 1

1

我可以通过检查编译器文档来预测行为吗?

如果编译器说明行为将是什么,那么如果您使用该编译器(并且它保留该行为),那么您可以依赖该行为。

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

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

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

您在问行为是如何定义的。它是未定义的。在此之后的任何时间都可能发生任何事情,至少就 POSIX pthreads 标准而言。除非有其他规定会发生什么,否则它可以是任何事情,你正式无权抱怨。

于 2014-11-05T07:56:15.767 回答