我在操作系統類中根據需要分配Linux FUTEX(2)
手冊頁,作爲對學生在設計同步原語時不要自滿的警告。什麼是FUTEX_REQUEUE錯誤?
系統調用futex()
是Linux提供的API,允許用戶級線程同步原語在必要時進入休眠狀態並喚醒。該手冊頁描述了可以使用系統調用futex()
調用的5個不同操作。這兩個基本操作是FUTEX_WAIT
(當線程嘗試獲取同步對象並且某人已經持有該線程時,該線程用於使自己進入睡眠狀態)和FUTEX_WAKE
(線程用於在釋放同步時喚醒任何等待的線程對象)。
接下來的三個操作是樂趣開始的地方。該名男子頁面描述是這樣的:
FUTEX_FD (present up to and including Linux 2.6.25)
[...]
Because it was inherently racy, FUTEX_FD has been removed
from Linux 2.6.26 onward.
本文"Futexes are Tricky" by Ulrich Dreper, 2004描述了競爭狀態(這是一個潛在的錯過喚醒)。但還有更多:
FUTEX_REQUEUE (since Linux 2.5.70)
This operation was introduced in order to avoid a
"thundering herd" effect when FUTEX_WAKE is used and all
processes woken up need to acquire another futex. [...]
FUTEX_CMP_REQUEUE (since Linux 2.6.7)
There was a race in the intended use of FUTEX_REQUEUE, so
FUTEX_CMP_REQUEUE was introduced. [...]
FUTEX_REQUEUE
是什麼種族? Ulrich的論文甚至沒有提及它(本文描述了使用FUTEX_CMP_REQUEUE
而不是FUTEX_REQUEUE
操作實現的功能futex_requeue()
)。
這是一個答案的開始,但什麼是可能的比賽?該文件沒有說。 – Gilles 2014-08-28 14:27:48
是的,這是答案的一部分......就像我今天早上能夠挖掘的那樣。我想這是值得發佈的情況下,以防其他人想跳進來。 – superdesk 2014-08-28 14:30:32