linux多執行緒程式設計的七條準則

2022-05-23 06:33:10 字數 1622 閱讀 5456

準則3:多執行緒程式裡不准使用fork。原文

準則4:不要做執行緒的非同步撤消的設計。原文

非同步撤消是指:某個執行緒的執行立刻被其它執行緒所終止了。
請不要單單為了讓設計更簡單或者看起來更簡單而使用非同步撤消設計。
乙個非同步撤消設計導致死鎖的場景:
執行緒1呼叫malloc正在做記憶體分配時,執行緒2非同步撤消了執行緒1的執行。
執行緒1馬上被撤消,但malloc中的mutex互斥鎖沒有被解除。
後面任意乙個執行緒呼叫malloc都會導致死鎖。
如何避免這些問題?
使用pthread_cleanup_push函式,登記非同步撤消時的執行緒資料消除的**函式。但其對延遲撤消不能呼叫。
不要執行非同步撤消處理。
準則5:盡可能避免執行緒的延遲撤消處理。原文

和非同步撤消不同,延遲撤消的撤消處理會一直延遲到**上明示的撤消點之後才會被執行。
能否成為撤消點跟具體的函式實現也有關係,因此延遲撤消的自由度較高,需要考慮os和c庫版本、執行環境等等。
若撤消點位於lock-unlock之間,則可能會導致死鎖。為了迴避這個問題,注意利用pthread_cleanup_push函式在撤消時釋放掉互斥鎖。
c++與延遲撤消的相容度非常差,在使用c++的工程裡不使用延遲撤消還是比較實際的。
準則6:遵守多執行緒程式設計的常識。原文1

原文2

多執行緒環境下,非執行緒安全的函式,一定不要使用。
要讓自己編寫的函式符合執行緒安全:
在訪問共享資料之前一定要先鎖定。
如果c++的話,一定要注意函式的同步方法。
執行緒安全函式,是像下面這樣:
不要操作區域性的靜態變數和全域性變數,並且其它的非執行緒安全函式不要呼叫。
要操作這樣的變數的話,就要用mutex進行同步處理,來限制多個執行緒同時對其進行操作。

**:

設計溝通的七條經驗

經常有新入職的同學,搞不清設計師和別的職位如產品經理,在工作內容上有什麼區別。回答了幾次之後,我總結出兩方面的差別,簡單概括為 技能和定位。技能 指的是設計師掌握了專案中其他角色都不具備的能力 畫圖。這麼概括有點簡單粗暴了,事實上設計師的專業能力遠比畫圖兩字涵蓋的內容要廣。但 畫圖 確實是更容易被所...

設計溝通的七條經驗

經常有新入職的同學,搞不清設計師和別的職位如產品經理,在工作內容上有什麼區別。回答了幾次之後,我總結出兩方面的差別,簡單概括為 技能和定位。技能 指的是設計師掌握了專案中其他角色都不具備的能力 畫圖。這麼概括有點簡單粗暴了,事實上設計師的專業能力遠比畫圖兩字涵蓋的內容要廣。但 畫圖 確實是更容易被所...

評判SIEM的七條標準

近期tt發布了karen scarfone的針對siem產品選型的一系列分析文章,其中談及了她眼中的7條siem評判標準。這7條標準分別是 1 支援多少種型別和廠商的日誌源?這個不必多言。2 是否具備自主獲取資訊的能力,以彌補現有日誌的不足?這點是近幾年siem soc產品發展的乙個趨勢,譬如通過採...