malloc的可重入性和執行緒安全分析
阿新 • • 發佈:2018-12-19
malloc函式是一個我們經常使用的函式,如果不對會造成一些潛在的問題。下面就malloc函式的執行緒安全性和可重入性做一些分析。
我們知道一個函式要做到執行緒安全,需要解決多個執行緒呼叫函式時訪問共享資源的衝突。而一個函式要做到可重入,需要不在函式內部使用靜態或全域性資料,不返回靜態或全域性資料,也不呼叫不可重入函式。
malloc函式執行緒安全但是不可重入的,因為malloc函式在使用者空間要自己管理各程序共享的記憶體連結串列,由於有共享資源訪問,本身會造成執行緒不安全。為了做到執行緒安全,需要加鎖進行保護。同時這個鎖必須是遞迴鎖,因為如果當程式呼叫malloc函式時收到訊號,在訊號處理函式裡再呼叫malloc函式,如果使用一般的鎖就會造成死鎖(訊號處理函式中斷了原程式的執行),所以要使用遞迴鎖。
雖然使用遞迴鎖能夠保證malloc函式的執行緒安全性,但是不能保證它的可重入性。按上面的場景,程式呼叫malloc函式時收到訊號,在訊號處理函式裡再呼叫malloc函式就可能破壞共享的記憶體連結串列等資源,因而是不可重入的。
至於malloc函式訪問核心的共享資料結構可以正常的加鎖保護,因為一個程序程呼叫malloc函式進入核心時,必須等到返回使用者空間前夕才能執行訊號處理函式,這時核心資料結構已經訪問完成,核心鎖已釋放,所以不會有問題。
---------------------
作者:無憂V
來源:CSDN
原文:https://blog.csdn.net/weiganyi/article/details/11142347
版權宣告:本文為博主原創文章,轉載請附上博文連結!