可重入函式與不可重入函式

2021-10-09 13:44:26 字數 548 閱讀 6971

在 實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任 務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會 出錯。不可重入函式在實時系統設計中被視為不安全函式。

滿足下列條件的函式多數是不可重入的:

(1)函式體內使用了靜態的資料結構;

(2)函式體內呼叫了malloc()或者free()函式;

(3)函式體內呼叫了標準i/o函式。

如何寫出可重入的函式?在函式體內不訪問那些全域性變數,不使用靜態區域性變數,堅持只使用預設態(auto)區域性變數,寫出的函式就將是可重入的。如果必須訪問全域性變數,記住利用互斥訊號量來保護全域性變數。或者呼叫該函式前關中斷,呼叫後再開中斷。

可重入函式可以被乙個以上的任務呼叫,而不必擔心資料被破壞。可重入函式任何時候都可以被中斷,一段時間以後又可以執行,而相應的資料不會丟失。可重入函式或者只使用區域性變數,即儲存在cpu暫存器中或堆疊中;或者使用全域性變數,則要對全域性變數予以保護。

可重入函式與不可重入函式

可重入 reentrant 函式可以由多於乙個任務併發使用,而不必擔心資料錯誤。相反,不可重入 non reentrant 函式不能由超過乙個任務所共享,除非能確保函式的互斥 或者使用訊號量,或者在 的關鍵部分禁用中斷 可重入函式可以在任意時刻被中斷,稍後再繼續執行,不會丟失資料。可重入函式要麼使用...

可重入函式與不可重入函式

可重入 可重新進入,也即兩次進入的現場一模一樣?在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指乙個可以被多個任務呼叫...

不可重入函式 與 可重入函式

不可重入函式不可以在它還沒有返回就再次被呼叫 該函式在被呼叫還沒有結束之前,再次被呼叫,從而可能產生錯誤。但是,可重入函式不存在這樣的問題。不可重入函式在實現時通常使用了全域性的資源 eg.全域性變數 在多執行緒的環境下,如果沒有很好的處理資料保護和互斥訪問,就可能會發生錯誤。常見的不可重入函式有 ...