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標準所說的那樣。除非另有說明,否則它可能是任何事情,你無權正式投訴。