2017-04-27 492 views
0

我正在查看wait_event_timeout宏(在wait.h中),無法理解是否總是在返回之前檢查條件。再次說明wait_event_timeout

它是否保證,如果超時已過期條件爲真,它永遠不會返回零?

這個宏很容易理解。也許我需要寫一個演示來證明這一點......任何人都可以提供一個簡單而有說服力的例子嗎?

- DD

+1

不知道我理解正確。你的意思是在超時的情況下,情況變成了現實嗎?其他兩種情況 - 之前和之後 - 從評論中顯而易見(http://elixir.free-electrons.com/linux/v4.10/source/include/linux/wait.h#L371)。最後它真的很重要嗎?從wait_event_timeout返回後,人們總是可以檢查條件,這是使用它的很多代碼所做的。 – bytefire

+0

這正是我的情況。我有一個項目,他們在調用wait_event_timeout後重新檢查條件。我建議刪除我認爲是多餘的代碼,他們反對但無法解釋爲什麼。是否有任何角落案例或天堂禁止,知道編譯器錯誤,證明重新檢查條件?或者它只是一個心理學的東西,比如呃,迷信? – ddbug

回答

0

而答案似乎是這樣的:在 的wait_event_timeout行爲的關鍵變化發生的內核版本3.10左右。

在此更改之前,如果事件從未發出信號,則wait_event_timeout將返回0,並且必須手動重新檢查該條件,以防某些其他事件(通過中斷,另一個線程等)變爲true。

在此版本之後,如果事件從未發出信號,則wait_event_timeout將返回1,但指定的條件成立。超時過期後,API本身會進行條件檢查。

wait.h中關於此API的文檔從版本3.18開始顯式描述了新行爲。

感謝所有雅誰旨在幫助:) - DD