併發程式設計的 15 條建議 譯

2021-09-08 07:25:50 字數 2441 閱讀 4754

核心專家 bryan cantrill 和 jeff bonwick 在 2008 年 9 月的《acm queue》上發表了《real-world concurrency》 一文,提出了 15 條併發程式設計的建議,這裡簡單摘錄如下。

1.know your cold paths from your hot paths.弄清楚**裡的熱門執行路徑和冷門執行路徑。

對冷門路徑,用粗粒度的鎖即可。對熱門路徑——也就是那些必須高度併發才能實現所期望的高吞吐量的**,應該更加小心,加鎖的策略必須簡單明瞭且細粒度。

2.intuition is frequently wrong—be data intensive.直覺常常是錯的,要靠資料說話。

【陳碩】比如執行緒切換到底有多大開銷,普通 mutex 加鎖到底有多大代價,系統呼叫的開銷如何,gettimeofday() 在 x86-64 linux 是不是真的系統呼叫等等,都要靠資料說話。

3.know when—and when not—to break up a lock.知道什麼時候把乙個鎖拆成多個,並知道什麼時候不必這樣做。

除了把全域性鎖拆成多個鎖,另外一種常用的避免執行緒爭用 (contention) 的辦法是減少加鎖的範圍。比方說從共享的資料結構裡移除(remove and delete)元素,其實 delete 這一步可以放到鎖外面。

4.be wary of readers/writer locks.警惕讀寫鎖。

初學者常犯的乙個錯誤是,見到某個資料結構頻繁讀而很少寫,那麼就把 mutex 替換為 rwlock。這不見得是正確的。

【陳碩】這條深得我心,muduo thread lib 目前就沒有提供讀寫鎖的封裝。另外,這一條也能鑑別另一篇關於執行緒爭用的文章不靠譜。

5.consider per-cpu locking.考慮用每個 cpu 用乙個鎖。

6.know when to broadcast—and when to signal.知道什麼時候用單個喚醒,什麼時候用廣播喚醒。

notifyall() 通常表示狀態變更,而 notify() 通常表示資源變得可用。濫用 notifyall() 會導致驚群現象。

【陳碩】 muduo thread lib 的 threadpool 區分使用 notify() 和 notifyall(),可作參考。

7.learn to debug postmortem.學會驗屍。

【陳碩】 在程式中只使用 scoped locking 來加鎖的話,很容易從 call stack 查出死鎖。參考《多執行緒伺服器的常用程式設計模型》第 6 節 執行緒間同步。

8.design your systems to be composable.設計系統,使之能擴充。

【陳碩】 比方說,把對物件的修改操作都挪到同乙個執行緒,這樣就不必加鎖。參考 muduo 的 eventloop::runinloop()。

9.don』t use a semaphore where a mutex would suffice.如果 mutex 就能解決問題的話,不要使用訊號量 semaphore。

【陳碩】muduo thread lib 有意識地不提供訊號量的封裝。

10.consider memory retiring to implement per-chain hash-table locks.考慮用記憶體「退休」法來實現雜湊表的按桶加鎖。

11.be aware of false sharing.知道什麼是偽共享。

跟多 cpu 的 cache 有關,值得了解。

12.consider using nonblocking synchronization routines to monitor contention.考慮使用非阻塞的加鎖來觀察執行緒爭用。

13.when reacquiring locks, consider using generation counts to detect state change.在重新加鎖時,考慮使用版本號來檢測狀態變更。

14.use wait- and lock-free structures only if you absolutely must.只在別無它法時才使用無鎖資料結構。

15.prepare for the thrill of victory—and the agony of defeat.準備接受成功的喜悅和失敗的痛苦。

更詳細的解釋請看原文。

bryan cantrill 是 dtrace 的主要作者,jeff bonwick 是 zfs 和 slab allocator 的發明者。

併發程式設計的 15 條建議 譯

收藏 摘要 核心專家 bryan cantrill 和 jeff bonwick 在 2008 年 9 月的 acm queue 上發表了 real world concurrency 一文,提出了 15 條併發程式設計的建議,這裡簡單摘錄如下。1.know your cold paths from...

併發程式設計的 15 條建議 譯 zz

核心專家 bryan cantrill 和 jeff bonwick 在 2008 年 9 月的 acm queue 上發表了 real world concurrency 一文,提出了 15 條併發程式設計的建議,這裡簡單摘錄如下。1.know your cold paths from your ...

提高程式設計能力的7條建議

程式設計是非常酷的一件事情,但是在酷炫的背後它對很多人來說還是挺難的。很多人在學習程式設計之初就被困難擊敗了。當你不熟悉程式設計的時候,你可能會覺得無從下手,並且不知道如何運用學到的知識。只要你通過了這一困難的學習階段,你就會發現乙個全新的世界。以下是一些能夠幫助你快速提高程式設計技巧的建議。1.多...