可重入函式和不可重入函式

2021-06-27 12:50:43 字數 562 閱讀 1176

可重入函式

可重入函式主要用於多工環境中,乙個可重入函式簡單來說是可以被中斷的函式,即可以在函式執行的任何時刻中斷它,轉入os排程下去執行另一段**,而返回控制時不出現錯誤,這意味著它除了使用自己棧上的變數以外,不依賴於任何環境(包括static),這樣的函式就是purecode(純**)可重入,它可以允許該函式有多個副本在執行,由於它們使用的是分離的棧,故不會相互干擾。

如果確實需要訪問全域性變數(包括static),如果確實需要訪問全域性變數,一定要實施互斥手段。可重入函式在並行執行環境中非常重要,但要為訪問全域性變數付出一些效能代價。

編寫可重入函式時,若使用全域性變數,則應通過關中斷,訊號量等手段對其加以保護,若不加以保護,則此函式就不具有可重入性,當多個程序呼叫此函式時,很有可能讓全域性變數變為不可知狀態。我們應盡量使用區域性變數;

不可重入函式

如果函式使用了一些系統資源,如全域性變數區、中斷向量表等靜態的資料結構;

函式體內呼叫了malloc和free函式;

函式體內呼叫了標準的io函式;

則該函式是不可重入函式,如果被中斷的話,可能會出現問題,這類函式是不能執行在多工下的。

可重入函式和不可重入函式

作為乙個程式設計人員,一定要有可重入和不可重入概念,但工作中發現的現象讓我大跌眼鏡 很多人沒聽說過!亡羊補牢,為時不晚,現在在腦子中種下這顆概念種子也不遲。為什麼說一定要有可重入和不可重入的概念呢,因為我們的程式肯定不只在main 函式中簡單的跑乙個while 1 迴圈,一般都會涉及到中斷和作業系統...

可重入函式和不可重入函式

在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果有乙個函式不幸被設計成為這樣 那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。注 含有全域性變數或者靜態成員變數 不可重入函式 相反,肯定有乙個安全的函式...

可重入和不可重入函式

把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。1 不要使用全域性變數。因為別的 很可能覆蓋這些變數值。2 在和硬體發生互動的時候,切記執行類似disinterrupt 之類的操作,就是關閉硬體中斷。完成互動記得...