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

2021-08-24 21:35:26 字數 564 閱讀 2812

文章出處:

作者****:李先靜

在生產者-消費者的練習中,大部分人選擇了由呼叫者來加鎖:作為生產者,往雙向煉表裡插入資料時,先加鎖,插入資料,然後解鎖。作 為消費者,從雙向煉表裡取資料時,先加鎖,刪除資料,然後解鎖。這是合理的,不過有點麻煩:每個呼叫者都要做這些動作,如果其中乙個呼叫者忘記了解鎖的步 驟,就會造成死鎖。而且呼叫者必須要清楚自己是在多執行緒下工作,這些**放到單執行緒的環境中就不能使用了。

在很多情況下由實現者來加鎖是比較好的選擇,那樣對呼叫者更為友好,可以避免出現一些不必要的錯誤。比如像目前linux下流行的dbus,它是一 套程序間通訊框架,它支援單執行緒和多執行緒版本,但呼叫者不需要明確加鎖/解鎖,也不需要連線不同的庫或者用巨集來控制,單執行緒版本和多執行緒版本的不同只是在 乙個初始化函式上。

這裡我們請讀者對前面實現的雙向鍊錶做點改進:

o 支援多執行緒和單執行緒版本。對於多執行緒版本,由實現者(在鍊錶)加鎖/解鎖,對於單執行緒版本,其效能不受影響(或很小)。

o區分單執行緒版本和多執行緒版本時,不需要鏈結不同的庫,或者要巨集來控制,完全可以在執行時切換。

o 保持雙向鍊錶的通用性,不依賴於特定的平台。

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

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

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

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

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

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