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