3 回答
TA貢獻1834條經驗 獲得超8個贊
問題:“是malloc reentrant”嗎?
答:不,不是。以下是使例程重入的定義。
malloc的常見版本都不允許您重新輸入它(例如,來自信號處理程序)。請注意,可重入例程可能不使用鎖,并且現有的幾乎所有malloc版本都使用鎖(這使它們成為線程安全的)或全局/靜態變量(這使得它們不是線程不安全且不可重入)。
到目前為止,所有的答案都回答“是malloc線程安全嗎?”,這是一個完全不同的問題。對于這個問題,答案是它取決于你的運行時庫,也可能取決于你使用的編譯器標志。在任何現代UNIX上,默認情況下您將獲得一個線程安全的malloc。在Windows中,使用/MT,/MTd,/MD或/MDd標志來獲得線程安全的運行時庫。
TA貢獻1995條經驗 獲得超2個贊
這是一個非常古老的問題,我希望根據當前的狀況帶來新鮮感。
是的,目前malloc()是線程安全的。
從GNU C庫參考手冊的glibc-2.20 [released 2014-09-07]:
void * malloc (size_t size)初步:MT-Safe | ...
...... 1.2.2.1 POSIX安全概念:
... MT-Safe或線程安全功能可以在其他線程存在的情況下安全地調用。在MT-Safe中,MT代表Multi Thread。
MT-Safe并不意味著函數是原子的,也不是它使用POSIX向用戶公開的任何內存同步機制。甚至可能按順序調用MT-Safe功能也不會產生MT-Safe組合。例如,讓一個線程一個接一個地調用兩個MT-Safe函數并不能保證等同于兩個函數組合的原子執行的行為,因為其他線程中的并發調用可能以破壞性方式干擾。
可以跨庫接口內聯函數的整個程序優化可能會暴露不安全的重新排序,因此不建議在GNU C庫接口上執行內聯。在全程序優化下,無法保證記錄的MT安全狀態。但是,用戶可見標頭中定義的功能旨在安全地進行內聯。
- 3 回答
- 0 關注
- 1184 瀏覽
添加回答
舉報
