2017-06-02 41 views
2

以下是方案。鮑勃是一位作家,愛麗絲是一位讀者。鮑勃寫東西,艾麗斯讀它們。規則是:虛擬鎖機制:非阻塞寫入,讀取和無效

1)Bob可以寫出Alice是否正在讀取(讀取不阻止寫入)。

2)當鮑勃寫信時,艾麗斯無法讀取(寫入塊讀取)。 3)當Alice完成閱讀時,她可以知道Bob在她的閱讀過程中是否寫過(讀者可以檢測到他們剛纔閱讀的數據是否無效)。

2)和3)實際上是一個組合規則,但我列出了兩個好的討論。這個問題可以通過一個互斥體和一個計數器(版本號)來解決,但我不知道的是,上面是一個常用名稱的公知方案?有沒有對此做過研究?

+0

可能是你談論交易嗎? 1.收集數據2.鎖定互斥鎖3.存儲4.解鎖 – user5821508

+3

關於1)和2):當愛麗絲正在閱讀和鮑勃想寫什麼? 1)和2)在這種情況下似乎是矛盾的 – bolov

+0

@ user5821508對於Bob,它是無鎖的。直接存儲數據。 – mzer0

回答

3

我不知道的是,這個問題是一個以術語命名的公知方案嗎?

是的,它被稱爲順序鎖: https://en.wikipedia.org/wiki/Seqlock

它有沒有人研究或我只是做一個輪子?

AFAIK有各種實現(如Linux內核)和論文。

+1

寫入不會(技術上)阻止讀取。它只是使它們無效,並使用序列號,以便讀者可以知道他們是否讀取了現在無效的數據。在C++中,它會稍微注意(我建議)原子,內存順序和內存隔離,以實現這一點。特別是作者在獲取鎖定之後並在釋放之前更新序列號。爲確保所需的排序,這些操作需要通過互斥之外的其他命令來排序。 對於單個值原子可能是一個更簡單/更快/更可預測的選項。 – Persixty