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

2021-07-12 05:26:06 字數 492 閱讀 7233

不可重入函式不可以在它還沒有返回就再次被呼叫;該函式在被呼叫還沒有結束之前,再次被呼叫,從而可能產生錯誤。 但是,可重入函式不存在這樣的問題。

不可重入函式在實現時通常使用了全域性的資源(eg. 全域性變數),在多執行緒的環境下,如果沒有很好的處理資料保護和互斥訪問,就可能會發生錯誤。

常見的不可重入函式有:

printf ---引用全域性變數stdout;

malloc ---全域性記憶體分配表,分配堆疊空間;

free ---全域性記憶體分配表,釋放堆疊空間;

以prinf為例,中斷在任何時候都可能發生,比如發生在prinft執行過程中,假若又發生了中斷巢狀,而此時stdout資源被占用,所以第二個中斷的printf等待第乙個中斷的stdout資源釋放,而第乙個中斷等待第二個中斷返回,造成了死鎖,這樣printf就發生了重入,這種情況是不允許的。

在unix裡面,通常會有加上_r的字尾同名可重入函式版本。如果實在沒有,不妨在可預見的發生錯誤的地方嘗試加上保護鎖同步機制等。

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

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

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

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

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

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