3 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
問題:“是malloc reentrant”嗎?
答:不,不是。以下是使例程重入的定義。
malloc的常見版本都不允許您重新輸入它(例如,來自信號(hào)處理程序)。請(qǐng)注意,可重入例程可能不使用鎖,并且現(xiàn)有的幾乎所有malloc版本都使用鎖(這使它們成為線程安全的)或全局/靜態(tài)變量(這使得它們不是線程不安全且不可重入)。
到目前為止,所有的答案都回答“是malloc線程安全嗎?”,這是一個(gè)完全不同的問題。對(duì)于這個(gè)問題,答案是它取決于你的運(yùn)行時(shí)庫,也可能取決于你使用的編譯器標(biāo)志。在任何現(xiàn)代UNIX上,默認(rèn)情況下您將獲得一個(gè)線程安全的malloc。在Windows中,使用/MT
,/MTd
,/MD
或/MDd
標(biāo)志來獲得線程安全的運(yùn)行時(shí)庫。

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是一個(gè)非常古老的問題,我希望根據(jù)當(dāng)前的狀況帶來新鮮感。
是的,目前malloc()
是線程安全的。
從GNU C庫參考手冊(cè)的glibc-2.20 [released 2014-09-07]
:
void * malloc (size_t size)
初步:MT-Safe | ...
...... 1.2.2.1 POSIX安全概念:
... MT-Safe或線程安全功能可以在其他線程存在的情況下安全地調(diào)用。在MT-Safe中,MT代表Multi Thread。
MT-Safe并不意味著函數(shù)是原子的,也不是它使用POSIX向用戶公開的任何內(nèi)存同步機(jī)制。甚至可能按順序調(diào)用MT-Safe功能也不會(huì)產(chǎn)生MT-Safe組合。例如,讓一個(gè)線程一個(gè)接一個(gè)地調(diào)用兩個(gè)MT-Safe函數(shù)并不能保證等同于兩個(gè)函數(shù)組合的原子執(zhí)行的行為,因?yàn)槠渌€程中的并發(fā)調(diào)用可能以破壞性方式干擾。
可以跨庫接口內(nèi)聯(lián)函數(shù)的整個(gè)程序優(yōu)化可能會(huì)暴露不安全的重新排序,因此不建議在GNU C庫接口上執(zhí)行內(nèi)聯(lián)。在全程序優(yōu)化下,無法保證記錄的MT安全狀態(tài)。但是,用戶可見標(biāo)頭中定義的功能旨在安全地進(jìn)行內(nèi)聯(lián)。
- 3 回答
- 0 關(guān)注
- 1136 瀏覽
添加回答
舉報(bào)