可重入函式與不可重入函式的區別

2022-06-03 05:51:10 字數 909 閱讀 1332

**自:

可重入函式可以做這樣的基本定義:重入意味著這個函式可以重複進入,可以被並行呼叫,可以被中斷,它只使用自身棧上的資料變數,它不依賴於任務環境,在多任務排程過程中,它是安全的,不必擔心資料出錯。

不可重入函式基本上與可重入函式有相反的定義了:不可重入,意味著不可被並行排程,否則會產生不可預料的結果,這些函式提內一般使用了靜態(static)的資料結構,使用了malloc()或者free()函式,使用了標準i/o函式等等。

在多工環境中或者實時系統設計中,應該盡可能的使用可重入函式,例如下面的函式:

該函式功能是計算不同籃子裡的蘋果數,函式體內沒有訪問全域性變數,不使用靜態區域性變數,只使用區域性變數,所以這個函式具有可重入的,如果必須使用全域性變數,那麼為了保證函式的安全,必須利用互斥訊號量或者中斷機制來保護全域性變數。例如下面函式:

int *package;

for(i = 0; i < n; i++)

temp += *(package++);

v操作(釋放訊號量);

return temp;

}象上面的pv操作機制就可以讓可重入函式安全的使用全域性變數了,而且保證了可並行性。

不可重入函式,例如:

static int sum = 0;

int cout_pear(int *package,int n)

這個函式由於使用了靜態全域性變數,對sum的並行性操作結果是未知的,是不安全的操做。若此函式被多個程序呼叫的話,結果是未知的。因為,但語句(1)執行完一次或者幾次後,另外使用這個sum的函式可能正好被排程,並得到執行機會,那麼這個新執行的函式將使sum變成了另外的值,所以當(1)重新獲得執行機會時,sum的值已經變成了另外的值,這是不可預料的結果。

也可以這樣總結,在任務系統中要進行並行操作,應該保證函式的可重入性,或者使用訊號量、中斷等機制來保證資料的安全性操作。

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

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

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

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

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

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