可重入函數主要用於多任務環境中,一個可重入的函數簡單來講就是能夠被中斷的函數,也就是說,能夠在這個函數執行的任什麼時候刻中斷它,轉入OS調度下去執行另一段代碼,而返回控制時不會出現什麼錯誤;而不可重入的函數因爲使用了一些系統資源,好比全局變量區,中斷向量表等,因此它若是被中斷的話,可能會出現問題,這類函數是不能運行在多任務環境下的。ide
編寫可重入函數時,若使用全局變量,則應經過關中斷、信號量(即P、V 操做)等手段對其加以保護。函數
說明:若對所使用的全局變量不加以保護,則此函數就不具備可重入性,即當多個進程調用此函數時,頗有可能使有關全局變量變爲不可知狀態。進程
示例:假設Exam 是int 型全局變量,函數Squre_Exam 返回Exam 平方值。那麼以下函數不具備可重入性。資源
unsigned intexample( int para )it
{class
unsigned inttemp;變量
Exam = para;// (**)di
temp =Square_Exam( );view
return temp;vi
}
此函數若被多個進程調用的話,其結果多是未知的,由於當(**)語句剛執行完後,另一個使用本函數的進程可能正好被激活,那麼當新激活的進程執行到此函數時,將使Exam賦與另外一個不一樣的para 值,因此當控制從新回到「temp = Square_Exam( )」後,計算出的temp極可能不是預想中的結果。此函數應以下改進。
unsigned intexample( int para )
{
unsigned inttemp;
[申請信號量操做] // 若申請不到「信號量」,說明另外的進程正處於Exam = para; // 給Exam 賦值並計算其平方過程當中(即正在使用此temp = Square_Exam( ); // 信號),本進程必須等待其釋放信號後,纔可繼[釋放信號量操做]
// 續執行。若申請到信號,則可繼續執行,但其它進程必須等待本進程釋放信號量後,才能再使用本信號。
return temp;
}