解锁已经解锁的线程

时间:2014-11-05 03:58:45

标签: c multithreading pthreads undefined-behavior compiler-specific

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

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

但我怀疑是

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

是。 UB可以带来任何好处。例如,如果解锁函数无条件地减少锁定计数,则它可能会下溢,从而永久锁定互斥锁。

  

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

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