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