2014-08-27 59 views
5

我在操作系統類中根據需要分配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())。

回答

1

它看起來像是競爭條件是由於執行glibc中的互斥鎖以及它們與futexes的不一致。 FUTEX_CMP_REQUEUE似乎有需要支持更復雜的glibc互斥:

他們要複雜得多,因爲他們支持更多的功能,如測試僵局,以及遞歸鎖定。由於這個原因,他們有一個內部鎖保護額外的狀態。這種額外的鎖定意味着他們無法使用FUTEX_REQUEUE複用功能,因爲可能會出現比賽。

來源:http://locklessinc.com/articles/futex_cheat_sheet/

+0

這是一個答案的開始,但什麼是可能的比賽?該文件沒有說。 – Gilles 2014-08-28 14:27:48

+0

是的,這是答案的一部分......就像我今天早上能夠挖掘的那樣。我想這是值得發佈的情況下,以防其他人想跳進來。 – superdesk 2014-08-28 14:30:32