2

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

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

但是我的疑惑是

  1. 我能够通过检查编译器文档来预测行为?
  2. 有没有可能导致阻塞线程(死锁)?
  3. 未定义的行为将在pthread_mutex_unlock上看到它在哪里解锁已经解锁的线程?或者在未来的任何pthread调用中都可以看到未定义的行为?
+0

你到目前为止尝试过什么?请张贴你已经拿出的代码,并解释你有什么困难。 – haneefmubarak 2014-11-05 04:22:17

+5

未定义的行为是*未定义的行为*,任何可能发生* *(不只是当)调用导致未定义的行为后,并且我想如果它介入进程状态,它可能会影响任何线程执行,而不仅仅是打电话的人。 – didierc 2014-11-05 04:53:36

+0

@haneefmubarak。我们遇到了一个问题,线程花了很多时间来完成任务。不幸的是,当问题发生时我们没有任何痕迹。我在浏览代码时发现了这个错误。我试图将这个问题与这个未定义的行为联系起来。 – 2014-11-05 06:29:00

回答

1

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

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

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

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

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

您在问如何定义行为。它是未定义的。在这一点之后的任何时候都可能发生,至少就POSIX pthreads标准所说的那样。除非另有说明,否则它可能是任何事情,你无权正式投诉。