可重入函式主要用於多工環境中,乙個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。
編寫可重入函式時,若使用全域性變數,則應通過關中斷、訊號量(即p、v 操作)等手段對其加以保護。
說明:若對所使用的全域性變數不加以保護,則此函式就不具有可重入性,即當多個程序呼叫此函式時,很有可能使有關全域性變數變為不可知狀態。
示例:假設exam 是int 型全域性變數,函式squre_exam 返回exam 平方值。那麼如下函式不具有可重入性。
unsigned intexample( int para )
unsigned inttemp;
exam = para;// (**)
temp =square_exam( );
return temp;
此函式若被多個程序呼叫的話,其結果可能是未知的,因為當(**)語句剛執行完後,另外乙個使用本函式的程序可能正好被啟用,那麼當新啟用的程序執行到此函式時,將使exam賦與另乙個不同的para 值,所以當控制重新回到「temp = square_exam( )」後,計算出的temp很可能不是預想中的結果。此函式應如下改進。
unsigned intexample( int para )
unsigned inttemp;
[申請訊號量操作] // 若申請不到「訊號量」,說明另外的程序正處於exam = para; // 給exam 賦值並計算其平方過程中(即正在使用此temp = square_exam( ); // 訊號),本程序必須等待其釋放訊號後,才可繼[釋放訊號量操作]
// 續執行。若申請到訊號,則可繼續執行,但其它程序必須等待本程序釋放訊號量後,才能再使用本訊號。
return temp;
C語言 可重入函式
可重入函式指乙個可同時被多個任務呼叫的過程,當乙個函式滿足下列條件時多為不可重入函式 1 函式中使用了靜態的資料結構 2 函式中使用了malloc free 函式 3 函式彙總呼叫了標準i o函式。如open read write close等系統呼叫 1 編寫可重入函式時,不應使用static區域...
C語言之可重入函式 不可重入函式
可重入函式 在 實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任 務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料...
C語言之可重入函式 不可重入函式
可重入函式 在 實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任 務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料...