函式的可重入性(Reentrancy)

2021-06-18 08:15:30 字數 949 閱讀 1561

什麼是可重入?

可重入函式是乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會出錯。

在寫函式時只要考慮到盡量用區域性變數(例如暫存器、堆疊中的變數),對於要使用的全域性變數要加以保護(例如採用關中斷、訊號量等),這樣構成的函式就一定是乙個可重入的函式。

此外,編譯器是否有可重入函式的庫,與它所服務的作業系統有關,例如dos下的borlandc和microsoftc/c++等就不具備可重入的函式庫,這是因為dos是乙個單使用者單任務的作業系統。為了確保每乙個任務控制自己的私有變數,在乙個可重入的c函式中,須將這樣的變數聲名為區域性變數。c編譯器將這樣的變數存放在呼叫棧上或暫存器裡。

在vxworks中,多個任務可呼叫同一子函式或函式庫。vxworks系統動態連線工具使這相當容易,這種共享**讓系統更加高效,易於維護。

vxworks系統主要採用如下的幾種可重入技術:

動態堆疊變數

許多子函式只是純**,除了動態堆疊變數外沒有其他資料。呼叫程式的引數作為子函式的資料。這種子函式是完全可重入的,多個任務同時使用這種子函式,不會互相影響,因為它們各有自己的堆疊空間。

受保護的全域性和靜態變數

一些函式庫包含公有資料,多個任務的同時呼叫很可能會導致對公有資料的破壞,使用起來要格外小心。系統採用訊號量互斥機制來防止任務同時執行**的臨界區。

任務變數

一些公用函式要求對於每一呼叫程式都有明確的全域性或靜態變數值。為了滿足這一點,vxworks提供的任務變數允許4位元組變數加入到任務上下文中,當任務切換時變數的值也切換。

編寫可重入的函式,必須遵循以下的規則:

1.將所有的區域性變數申明為auto(預設態)或暫存器型。

2.盡量不要使用static或extern變數。如有必要,要用互斥機制進行保護。

個人心得:

在平時**開發過程中,設計的可重入函式還是比較多的,他的優點,如前面所說,設計可重入函式滿足多工呼叫同乙個函式,是系統更加高效,易於維護。

函式的可重入性

示例 可重入函式 int double int a 不可重入函式 void foo 對於函式中使用的某乙個變數,若兩次呼叫該函式時,這個變數都執行相同的結果,說明該函式是可重入的,否則是不可重入的。從經驗上來講就是 如果函式中使用了全域性變數或者靜態變數,則該函式是不可重入的,否則是可重入的。下面給...

訊號之函式的可重入性

訊號之函式的可重入性 在呼叫某個函式過程 現中斷訊號,且改訊號處理函式中再次呼叫該函式,訪問全域性 靜態變數的函式是不可重入函式。前後資料不一致,函式是不可重入的,特點 函式中使用全域性變數或靜態變數。前後資料一致,函式是可重入的,特徵 函式中使用區域性變數。root spark cat reins...

可重入函式 可重入核心

可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...