執行緒鎖使用經驗

2021-09-29 12:57:04 字數 1316 閱讀 6010

一.減少鎖的使用

鎖使用帶來如下效能損失:

1.加鎖和解鎖操作,本身有一定的開銷;

2.臨界區的**不能併發執行;

3.入臨界區的次數過於頻繁,執行緒之間對臨界區的爭奪太過激烈,若執行緒競爭互斥量失敗,就會陷入阻塞,讓出 cpu,因此執行上下文切換的次數要遠遠多於不使用互斥量的

代替鎖的辦法有很多,如使用無鎖佇列。

二.明確鎖的範圍

if(hashtable.is_empty())

上面的**判斷是否為空的時候也需要進行保護,所以進行如下修改

pthread_mutex_lock(&mutex);

if(hashtable.is_empty())

pthread_mutex_unlock(&mutex);

三.減少鎖的粒度

減小鎖使用粒度指的是盡量減小鎖作用的臨界區**範圍,臨界區的**範圍越小,多個執行緒排隊進入臨界區的時間就會越短。這就類似高速公路上堵車,如果堵車的路段越長,那麼後續過來的車輛通行等待時間就會越長。

void taskpool::addtask(task* task)

沒必要的臨界區的**挪到鎖外面去

void taskpool::addtask(task* task)

m_cv.notify_one();

}

四.避免死鎖建議

1.一個函式中,如果有乙個加鎖操作,那麼一定要記得在函式退出時記得解鎖,且每個退出路徑上都不要忘記解鎖路徑。例如:

void func_demo()

else

if (條件2)

if (條件4)

} while (條件5)

}}

但是實際中這樣寫很容易疏忽而忘記解鎖,對應的解決辦法是raii 技術(物件的思想)將加鎖和解鎖**封裝起來。

2.執行緒退出的時候一定要及時釋放其持有的鎖

3.多執行緒請求鎖的方向要一致,避免死鎖

4.當需要同乙個執行緒重複請求乙個鎖時,搞清楚你所使用的鎖的行為,是遞增鎖引用計數,還是會阻塞抑或是直接獲得鎖?

五.避免活鎖建議

盡量避免不要過多的執行緒使用trylock請求鎖,以免出現「活鎖」現象,這是對資源的一種浪費。

python 什麼是執行緒鎖,如何使用執行緒鎖

執行緒鎖 目的是將一段 鎖住,一旦獲得鎖許可權,除非釋放執行緒鎖,否則其他 都無法獲得鎖許可權。為什麼需要執行緒鎖?多執行緒同時完成特定的操作時,由於並不是原子操作,所以在完成操作的過程中會被打斷去做其他的工作,可能會產生髒資料 例如 乙個執行緒讀取變數n 初始值為0 然後n 最後輸出n。當執行完n...

C 執行緒鎖使用全功略

前兩篇簡單介紹了執行緒同步lock,monitor,同步事件eventwaithandler,互斥體mutex的基本用法,在此基礎上,我們對 它們用法進行比較,並給出什麼時候需要鎖什麼時候不需要的幾點建議。最後,介紹幾個fcl中線程安全的類,集合類的鎖定方式等,做為對執行緒同步系列的完善 和補充。l...

執行緒 互斥鎖的使用

一 執行緒間通訊 互斥 1.臨界資源 一次只允許乙個任務 2.臨界區 訪問臨界區的 3.互斥機制 1 mutex互斥鎖 2 鎖的使用過程 任務訪問臨界資源前申請鎖,訪問完釋放鎖 二 函式介紹 1.互斥鎖的初始化 方法1 動態方式建立互斥鎖 include intpthread mutex init ...