c語言可重入函數

可重入函數主要用於多任務環境中,一個可重入的函數簡單來講就是能夠被中斷的函數,也就是說,能夠在這個函數執行的任什麼時候刻中斷它,轉入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;

}

相關文章
相關標籤/搜索