假設Exam是int型全域性變數,函式Square_Exam返回Exam平方值。那麼如下函式不具有可重入性。
unsigned int example( int para )
{
unsigned int temp;
Exam = para; // (**)
temp = Square_Exam( );
return temp;
}
此函式若被多個程序呼叫的話,其結果可能是未知的,因為當(**)語句剛執行完後,另外一個使用本函式的程序可能正好被啟用,那麼當新啟用的程序執行到此函式時,將使Exam賦與另一個不同的para值,所以當控制重新回到“temp = Square_Exam( )”後,計算出的temp很可能不是預想中的結果。此函式應如下改進。
[申請訊號量操作] //(1)
Exam = para;
[釋放訊號量操作]
(1)若申請不到“訊號量”,說明另外的程序正處於給Exam賦值並計算其平方過程中(即正在使用此訊號),本程序必須等待其釋放訊號後,才可繼續執行。若申請到訊號,則可繼續執行,但其它程序必須等待本程序釋放訊號量後,才能再使用本訊號。
保證函式的可重入性的方法:在寫函式時候儘量使用區域性變數(例如暫存器、堆疊中的變數),對於要使用的全域性變數要加以保護(如採取關中斷、訊號量等方法),這樣構成的函式就一定是一個可重入的函式。
VxWorks中採取的可重入的技術有:
* 動態堆疊變數(各子函式有自己獨立的堆疊空間)
* 受保護的全域性變數和靜態變數
* 任務變數
假設Exam是int型全域性變數,函式Square_Exam返回Exam平方值。那麼如下函式不具有可重入性。
unsigned int example( int para )
{
unsigned int temp;
Exam = para; // (**)
temp = Square_Exam( );
return temp;
}
此函式若被多個程序呼叫的話,其結果可能是未知的,因為當(**)語句剛執行完後,另外一個使用本函式的程序可能正好被啟用,那麼當新啟用的程序執行到此函式時,將使Exam賦與另一個不同的para值,所以當控制重新回到“temp = Square_Exam( )”後,計算出的temp很可能不是預想中的結果。此函式應如下改進。
unsigned int example( int para )
{
unsigned int temp;
[申請訊號量操作] //(1)
Exam = para;
temp = Square_Exam( );
[釋放訊號量操作]
return temp;
}
(1)若申請不到“訊號量”,說明另外的程序正處於給Exam賦值並計算其平方過程中(即正在使用此訊號),本程序必須等待其釋放訊號後,才可繼續執行。若申請到訊號,則可繼續執行,但其它程序必須等待本程序釋放訊號量後,才能再使用本訊號。
保證函式的可重入性的方法:在寫函式時候儘量使用區域性變數(例如暫存器、堆疊中的變數),對於要使用的全域性變數要加以保護(如採取關中斷、訊號量等方法),這樣構成的函式就一定是一個可重入的函式。
VxWorks中採取的可重入的技術有:
* 動態堆疊變數(各子函式有自己獨立的堆疊空間)
* 受保護的全域性變數和靜態變數
* 任務變數