2010-02-25 102 views
6

這是一個面試問題。你如何實現讀/寫互斥?將有多個線程讀取和寫入資源。我不知道如何去做。如果有任何需要的信息,請告訴我。閱讀在C++中編寫互斥體

更新:我不確定上述聲明是否有效/可理解。但是我真正想知道的是,如何根據互斥鎖和其他需要的同步對象在單個對象上實現多次讀取和多次寫入?

+0

您是否在談論使用互斥/信號量/條件變量實現的普通互斥鎖或多讀/單寫互斥鎖? – stefaanv 2010-02-25 14:23:19

+0

@stefaanv:我不確定,但我認爲它是用互斥/信號/條件變量實現的多讀/多寫互斥。有這樣的事情嗎? – jasonline 2010-02-25 14:37:42

+0

多讀/單寫互斥體不是直截了當的,我只是有一個鏡頭,並失敗:-(所以這裏是維基百科鏈接:http://en.wikipedia.org/wiki/Readers-writer_lock – stefaanv 2010-02-25 14:59:25

回答

12

結賬Dekker's algorithm

德克爾的算法是第一個已知的 正確解決相互排斥 問題併發編程 。解決方案是歸因於荷蘭數學家Th的 。 J. Dekker由Edsger W. Dijkstra在他的 手稿上合作連續 過程。它允許兩個線程共享一個沒有 衝突的單次使用資源,只使用共享內存進行 通信。

請注意,Dekker算法使用spinlock(而不是busy waiting)技術。
(TH。J.德克爾的解決方案,由E. W. Dijkstra算法在他EWD1303 paper提到) alt text

+1

我喜歡你只是回答了問題,而不是進入操作系統nitty砂礫:) – 2010-02-25 13:58:38

1

簡短的回答是,這是令人驚訝的難以推出自己的讀/寫鎖。很容易錯過可能導致死鎖的非常微妙的時間問題,兩條線索都認爲它們具有「獨佔」鎖等。

簡而言之,您需要記錄有多少讀取器處於活動狀態在任何特定的時間。只有當活動閱讀器的數量爲零時,您是否應授予線程寫入權限。讀者或作者是否被賦予優先權有一些設計選擇。 (通常情況下,您希望賦予作者優先權,但假設寫作不那麼頻繁。)(令人驚訝的)棘手的部分是確保在有讀者時沒有作者被授予訪問權,反之亦然。

有一個很好的MSDN文章,"Compound Win32 Synchronization Objects",帶你通過創建一個讀寫器鎖。它開始簡單,然後越來越複雜,以處理所有的角落案件。有一點非常突出,那就是他們展示了一個看起來非常好的樣本 - 然後他們會解釋爲什麼它不會真正起作用。如果他們沒有指出問題,你可能從未注意到。值得一讀。

希望這是有幫助的。

0

這聽起來像是一個相當困難的面試問題;從頭開始編寫一個讀卡器的意義上說,我不會「實現」一個讀/寫互斥鎖 - 現有的解決方案要好得多。明智的現實世界將是使用現有的互斥體類型。也許他們真正想知道的是你將如何使用這種類型?

+0

ShellShock:讀/寫互斥鎖可能不會實現一個普通的互斥量和信號量?我對信號量不熟悉,但是我有一種感覺,採訪者正在把我引向這個解決方案。 – jasonline 2010-02-25 14:10:27

+1

您可以推薦的現成解決方案的任何示例? – jasonline 2010-02-25 14:14:34

0

Afaik您需要一個原子比較和交換指令,或者您需要能夠禁用中斷。請參閱維基百科上的Compare-and-swap。至少,操作系統將如何實現它。如果你有一個操作系統,站在它的肩膀上,並使用現有的庫(例如boost)。