之前寫過一些多執行緒程式,基本上都是執行緒競爭條件比較少或者說沒有,所以基本上沒有碰見過死鎖以及其他情況,以至於我自以為多執行緒的使用也並沒那麼難。
如之前我寫過的一篇乙個簡單的生產者與消費者,那時候寫得也不太好,大概是使用乙個互斥量去保護物品佇列的獲取與生產,乙個條件變數去判斷佇列是否為滿或者空(以前是用兩個,有些多餘)。
因為之前寫的過於簡單,沒有思考到多執行緒多方面的資源競爭情況,所以今天來記錄一下一些寫多執行緒程式的時候需要注意的一些點吧。
ps:因為目前沒時間,不太好寫**來作例子,就直接寫一些注意的點,後面再來補充
1、注意競爭的資源是否存活,這裡可以使用智慧型指標去解決部分問題。
2、使用智慧型指標中的shared_ptr還是需要注意使用,比如原先乙個shared_ptr指向乙個物件,後面在其他的呼叫中不小心修改其指向導致原資源被釋放之類的,以及迴圈使用。
3、遞迴鎖與非遞迴鎖,c++thread預設的是非遞迴鎖,所以在編寫多執行緒程式的時候,要注意加鎖的位置。
4、當有多個物件且這些物件的訪問都是具有互斥鎖的情況下,為了避免死鎖,必須使這些鎖的上鎖順序相同(可以比較鎖的位址大小來上鎖)。
5、編寫多執行緒程式,需要良好的掌握臨界區的長度(鎖的區域)。
6、pthread提供的執行緒庫有執行緒自殺以及他殺的函式(pthread_exit、pthread_cancel),但是c++11中的thread並沒有提供這些功能,這是因為任何從外部終止執行緒的做法和想法都是錯的,因為強行終止會導致執行緒無法清理自己占用的資源,就比如已經持有的鎖,容易導致死鎖,如果非要終止這樣的任務,可以把這類任務使用多程序,然後kill程序。
7、pthread_once、pthread_key挺好用的。
多執行緒的一些小問題集錦
測試執行緒是否已經死亡,可以呼叫isalive 方法.當執行緒處於就緒 執行 阻塞三種狀態時,返回true 當執行緒處於死亡 新建狀態時返回false。例項 如下 package com.thread public class startdead extends thread public stat...
多執行緒的一些小知識(不斷補充)
最近學了一些c 多執行緒知識看的書是c 多執行緒實戰程式設計,就順便做一些筆記來幫助記憶。1 如何構建乙個hello world的多執行緒函式程式 首先建立乙個hello world函式 void helloworld 接著建立乙個執行緒加入函式指標 std thread t1 helloworld...
python區域性變數的一些小記
result def init result def run for item in items return result問題依舊存在沒有做初始化處理!因為對於init函式來說,result是新申請的變數,對於run來說,本身函式沒有result的宣告,所以預設尋找它上一次的result,所以in...