c語言可重入函數(shù)有哪些 什么是可重入函數(shù)?
什么是可重入函數(shù)?可重入函數(shù):主要用于多任務環(huán)境??芍厝牒瘮?shù)只是一個可以中斷的函數(shù)。換言之,當函數(shù)被執(zhí)行時,它可以在任何時候被中斷,然后轉(zhuǎn)移到操作系統(tǒng)調(diào)度以執(zhí)行另一段代碼。返回控件時不會出錯。單片機C
什么是可重入函數(shù)?
可重入函數(shù):主要用于多任務環(huán)境??芍厝牒瘮?shù)只是一個可以中斷的函數(shù)。換言之,當函數(shù)被執(zhí)行時,它可以在任何時候被中斷,然后轉(zhuǎn)移到操作系統(tǒng)調(diào)度以執(zhí)行另一段代碼。返回控件時不會出錯。
單片機C語言設計里說的可重入函數(shù)是什么?和不可重入函數(shù)的區(qū)別是什么?
1、可重入函數(shù)
1)什么是可重入函數(shù)?
可重入函數(shù)可由多個任務同時使用,無需擔心數(shù)據(jù)錯誤。相反,非可重入函數(shù)不能由多個任務共享,除非它們相互排斥(或者使用信號量,或者在代碼的關(guān)鍵部分禁用中斷)??芍厝牒瘮?shù)可以隨時中斷,以后繼續(xù)運行而不會丟失數(shù)據(jù)??芍厝牒瘮?shù)要么使用局部變量,要么在使用全局變量時保護其數(shù)據(jù)。
2)可重入函數(shù):
不保留連續(xù)調(diào)用的靜態(tài)數(shù)據(jù)。
不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)由函數(shù)的調(diào)用者提供。
通過使用本地數(shù)據(jù)或制作全局數(shù)據(jù)的本地副本來保護全局數(shù)據(jù)。
如果必須訪問全局變量,請記住使用互斥信號量保護它們。
切勿調(diào)用任何不可重入函數(shù)。
3)不可重入函數(shù):
函數(shù)中使用靜態(tài)變量,無論是全局變量還是局部變量。
函數(shù)返回一個靜態(tài)變量。在函數(shù)中調(diào)用不可重入的函數(shù)。
在函數(shù)體中使用靜態(tài)數(shù)據(jù)結(jié)構(gòu);
在函數(shù)體中調(diào)用malloc()或free()函數(shù);
在函數(shù)體中調(diào)用其他標準I/O函數(shù)。
函數(shù)是單例中的成員函數(shù),它使用的成員變量不是由線程獨立存儲的。
通常,如果函數(shù)在重入條件下使用未受保護的共享資源,則該函數(shù)不可重入
可重入函數(shù)可由多個任務同時使用,而無需擔心數(shù)據(jù)錯誤。相反,非可重入函數(shù)不能由多個任務共享,除非它們相互排斥(或者使用信號量,或者在代碼的關(guān)鍵部分禁用中斷)??芍厝牒瘮?shù)可以隨時中斷,以后繼續(xù)運行而不會丟失數(shù)據(jù)??芍厝牒瘮?shù)要么使用局部變量,要么在使用全局變量時保護其數(shù)據(jù)??芍厝牒瘮?shù):不為連續(xù)調(diào)用保存靜態(tài)數(shù)據(jù)。不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。通過使用本地數(shù)據(jù)或制作全局數(shù)據(jù)的本地副本來保護全局數(shù)據(jù)。如果必須訪問全局變量,請記住使用互斥信號量來保護它們。永遠不要調(diào)用任何不可重入的函數(shù)。
什么是可重入?
字面意思是您可以重復輸入。可重入性是多任務系統(tǒng)中的一個概念,它意味著該函數(shù)在運行到任何位置時都可以被中斷以執(zhí)行其他任務,并且返回時不會出錯。當我們同時處理多個任務時,為什么會有這個概念呢。我舉個例子。我們定義了一個名為func的函數(shù)和兩個線程。兩個線程都調(diào)用func。情況就是這樣。當線程1執(zhí)行func時,線程2開始執(zhí)行func。結(jié)果,兩個線程都執(zhí)行了兩次func。在正常情況下,兩個線程都可以成功執(zhí)行,并且沒有錯誤。我們認為func是一個可重入函數(shù)。但是,如果func使用一個公共資源,例如讀取同一個文件或訪問同一個全局變量,則當兩個線程訪問公共資源時,會導致沖突。這樣的函數(shù)是不可重入的。