系統程式設計師成長計畫 併發 四 上

2021-04-23 18:29:47 字數 586 閱讀 2238

作者****:李先靜

讀寫鎖在前面的實現中,像dlist_length這類的查詢函式也要加鎖,那樣才能保證在查詢過程中物件的狀態不會被其它執行緒所改變。加鎖阻止了其它線 程修改物件,也阻止其它執行緒查詢物件。如果大多數情況下,執行緒只是查詢物件的狀態而不修改它,這種設計不是一種高效的方法,因為它不允許多個執行緒同時查 詢。我們能不能實現一種鎖,它能序列化對資料結構的修改,而同時支援並行的查詢呢?

這就是所謂的讀寫鎖,也稱為共享-互斥鎖。這種鎖在資料庫管理系統中(dbms)和作業系統核心中大量應用,作為系統程式設計師,了解它的實現機制是有必要的。這裡我們請讀者實現讀寫鎖,要求如下:

o 不依賴於特定平台。

o 在任何情況下都不帶來額外的效能開銷。

記住多想多練不要偷懶,學習知識點不是我們最重要的目標,知識點能幫你解決別人解決過的問題,但對你解決新問題未必有多大好處,真正的程式設計師不應當 只是解決問題方案的販賣者。不斷從思考中學習解決問題的方法,加上靈活應用已經掌握的知識點,你的設計水平才會大大提高,這也是《系統程式設計師成長計畫》努 力的目標。

歡迎到linux mobile development上交流

系統程式設計師成長計畫 併發 四 上

文章出處 作者 李先靜 讀寫鎖在前面的實現中,像dlist length這類的查詢函式也要加鎖,那樣才能保證在查詢過程中物件的狀態不會被其它執行緒所改變。加鎖阻止了其它線 程修改物件,也阻止其它執行緒查詢物件。如果大多數情況下,執行緒只是查詢物件的狀態而不修改它,這種設計不是一種高效的方法,因為它不...

系統程式設計師成長計畫 併發 二 上

文章出處 作者 李先靜 在生產者 消費者的練習中,大部分人選擇了由呼叫者來加鎖 作為生產者,往雙向煉表裡插入資料時,先加鎖,插入資料,然後解鎖。作 為消費者,從雙向煉表裡取資料時,先加鎖,刪除資料,然後解鎖。這是合理的,不過有點麻煩 每個呼叫者都要做這些動作,如果其中乙個呼叫者忘記了解鎖的步 驟,就...

系統程式設計師成長計畫 併發 五

文章出處 作者 李先靜 無鎖 lock free 資料結構 多執行緒併發執行時,雖然有共享資料,如果所有執行緒只是讀取共享資料而不修改它,也是不用加鎖的,比如 段就是共享的 資料 每個執行緒都會讀取,但是不用加鎖。排除所有這些情況,多執行緒之間有共享資料,有的執行緒要修改這些共享資料,有的執行緒要讀...