不可重入函數(shù)匯總 遞歸函數(shù)在內(nèi)存只有一份拷貝,但按這樣理解遞歸是錯(cuò)誤的。是嗎?
遞歸函數(shù)在內(nèi)存只有一份拷貝,但按這樣理解遞歸是錯(cuò)誤的。是嗎?謝謝。首先,遞歸函數(shù)代碼只需要在內(nèi)存中有一個(gè)副本,通常只有一個(gè)副本。其次,這種理解只與編程語(yǔ)言和計(jì)算機(jī)體系結(jié)構(gòu)的實(shí)現(xiàn)有關(guān),與遞歸無(wú)關(guān)。以C為
遞歸函數(shù)在內(nèi)存只有一份拷貝,但按這樣理解遞歸是錯(cuò)誤的。是嗎?
謝謝。首先,遞歸函數(shù)代碼只需要在內(nèi)存中有一個(gè)副本,通常只有一個(gè)副本。
其次,這種理解只與編程語(yǔ)言和計(jì)算機(jī)體系結(jié)構(gòu)的實(shí)現(xiàn)有關(guān),與遞歸無(wú)關(guān)。
以C為例,函數(shù)的實(shí)現(xiàn)代碼通常存儲(chǔ)在文本部分,函數(shù)的每次調(diào)用都會(huì)在堆棧部分生成一個(gè)新的堆棧幀,其中存儲(chǔ)了該調(diào)用的上下文、局部變量等信息,函數(shù)返回時(shí)釋放該數(shù)據(jù)。
如果遞歸深度太大,堆??臻g不足以存儲(chǔ)這些調(diào)用生成的數(shù)據(jù),則很容易發(fā)生堆棧溢出錯(cuò)誤。
遞歸調(diào)用:內(nèi)存中只需要函數(shù)代碼的一個(gè)副本;而當(dāng)函數(shù)運(yùn)行時(shí),動(dòng)態(tài)數(shù)據(jù)可能有多個(gè)副本。
什么是可重入函數(shù)?
可重入函數(shù):主要用于多任務(wù)環(huán)境。可重入函數(shù)只是一個(gè)可以中斷的函數(shù)。換言之,當(dāng)函數(shù)被執(zhí)行時(shí),它可以在任何時(shí)候被中斷,然后轉(zhuǎn)移到操作系統(tǒng)調(diào)度以執(zhí)行另一段代碼。返回控件時(shí)不會(huì)出錯(cuò)。
什么是C語(yǔ)言的可重入函數(shù)?怎么使用?
字面意思是您可以重復(fù)輸入??芍厝胄允嵌嗳蝿?wù)系統(tǒng)中的一個(gè)概念,它意味著該函數(shù)在運(yùn)行到任何位置時(shí)都可以被中斷以執(zhí)行其他任務(wù),并且返回時(shí)不會(huì)出錯(cuò)。當(dāng)我們同時(shí)處理多個(gè)任務(wù)時(shí),為什么會(huì)有這個(gè)概念呢。我舉個(gè)例子。我們定義了一個(gè)名為func的函數(shù)和兩個(gè)線(xiàn)程。兩個(gè)線(xiàn)程都調(diào)用func。情況就是這樣。當(dāng)線(xiàn)程1執(zhí)行func時(shí),線(xiàn)程2開(kāi)始執(zhí)行func。結(jié)果,兩個(gè)線(xiàn)程都執(zhí)行了兩次func。在正常情況下,兩個(gè)線(xiàn)程都可以成功執(zhí)行,并且沒(méi)有錯(cuò)誤。我們認(rèn)為func是一個(gè)可重入函數(shù)。但是,如果func使用一個(gè)公共資源,例如讀取同一個(gè)文件或訪(fǎng)問(wèn)同一個(gè)全局變量,則當(dāng)兩個(gè)線(xiàn)程訪(fǎng)問(wèn)公共資源時(shí),會(huì)導(dǎo)致沖突。這樣的函數(shù)是不可重入的。
單片機(jī)C語(yǔ)言設(shè)計(jì)里說(shuō)的可重入函數(shù)是什么?和不可重入函數(shù)的區(qū)別是什么?
1、可重入函數(shù)
1)什么是可重入函數(shù)?
可重入函數(shù)可由多個(gè)任務(wù)同時(shí)使用,無(wú)需擔(dān)心數(shù)據(jù)錯(cuò)誤。相反,非可重入函數(shù)不能由多個(gè)任務(wù)共享,除非它們相互排斥(或者使用信號(hào)量,或者在代碼的關(guān)鍵部分禁用中斷)??芍厝牒瘮?shù)可以隨時(shí)中斷,以后繼續(xù)運(yùn)行而不會(huì)丟失數(shù)據(jù)。可重入函數(shù)要么使用局部變量,要么在使用全局變量時(shí)保護(hù)其數(shù)據(jù)。
2)可重入函數(shù):
不保留連續(xù)調(diào)用的靜態(tài)數(shù)據(jù)。
不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)由函數(shù)的調(diào)用者提供。
通過(guò)使用本地?cái)?shù)據(jù)或制作全局?jǐn)?shù)據(jù)的本地副本來(lái)保護(hù)全局?jǐn)?shù)據(jù)。
如果必須訪(fǎng)問(wèn)全局變量,請(qǐng)記住使用互斥信號(hào)量保護(hù)它們。
切勿調(diào)用任何不可重入函數(shù)。
3)不可重入函數(shù):
函數(shù)中使用靜態(tài)變量,無(wú)論是全局變量還是局部變量。
函數(shù)返回一個(gè)靜態(tài)變量。在函數(shù)中調(diào)用不可重入的函數(shù)。
在函數(shù)體中使用靜態(tài)數(shù)據(jù)結(jié)構(gòu);
在函數(shù)體中調(diào)用malloc()或free()函數(shù);
在函數(shù)體中調(diào)用其他標(biāo)準(zhǔn)I/O函數(shù)。
函數(shù)是單例中的成員函數(shù),它使用的成員變量不是由線(xiàn)程獨(dú)立存儲(chǔ)的。
通常,如果函數(shù)在重入條件下使用未受保護(hù)的共享資源,則該函數(shù)不可重入