在一个已经在运行的旧代码中,我发现了一个地方,他们试图解锁一个已经解锁的互斥对象。
我很清楚,解锁一个已经解锁的互斥会导致未定义的行为。
但我的疑虑是
- 我是否能够通过检查编译器文档来预测行为
- 是否有可能导致线程阻塞(死锁)
- 在解锁已解锁线程的
pthread_mutex_unlock
上会看到未定义的行为吗?或者在接下来的任何pthread调用中都可以看到未定义的行为
我是否能够通过检查编译器文档来预测行为?
如果编译器说明了行为,那么如果你使用该编译器(并且它保留了该行为),那么你就可以依赖该行为。
是否有可能导致线程阻塞(死锁)?
是的。UB可以导致任何事情。例如,如果unlock函数无条件地减少锁计数,它可能会下溢,从而使互斥锁永远锁定。
在pthread_mutex_unlock上会看到未定义的行为,它在哪里解锁了已经解锁的线程?或者在接下来的任何pthread调用中都可以看到未定义的行为?
你在问行为是如何定义的。它是未定义的。任何事情都可能在这一点之后的任何时候发生,至少就POSIXpthreads标准而言是这样。除非有其他事情具体说明会发生什么,否则它可能是任何事情,你正式无权抱怨。