Malloc函數的線程安全與可重入性分析

malloc函數是一個我們經常使用的函數,如果不對會造成一些潛在的問題。下面就malloc函數的線程安全性和可重入性做一些分析。

 我們知道一個函數要做到線程安全,需要解決多個線程調用函數時訪問共享資源的衝突。而一個函數要做到可重入,需要不在函數內部使用靜態或全局數據,不返回靜態或全局數據,也不調用不可重入函數。

 malloc函數線程安全但是不可重入的,因爲malloc函數在用戶空間要自己管理各進程共享的內存鏈表,由於有共享資源訪問,本身會造成線程不安全。爲了做到線程安全,需要加鎖進行保護。同時這個鎖必須是遞歸鎖,因爲如果當程序調用malloc函數時收到信號,在信號處理函數裏再調用malloc函數,如果使用一般的鎖就會造成死鎖(信號處理函數中斷了原程序的執行),所以要使用遞歸鎖。

 雖然使用遞歸鎖能夠保證malloc函數的線程安全性,但是不能保證它的可重入性。按上面的場景,程序調用malloc函數時收到信號,在信號處理函數裏再調用malloc函數就可能破壞共享的內存鏈表等資源,因而是不可重入的。

 至於malloc函數訪問內核的共享數據結構可以正常的加鎖保護,因爲一個進程程調用malloc函數進入內核時,必須等到返回用戶空間前夕才能執行信號處理函數,這時內核數據結構已經訪問完成,內核鎖已釋放,所以不會有問題。

 (完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章