可重入

若一個程式或副程式可以 「 在任意時刻被中斷然後作業系統調度執行另一段程式碼 ， 這段程式碼又使用了該副程式不會出錯 」 ， 則稱其爲可重入 （ reentrant 或 re-entrant ） 的 。 即當該副程式正在運作時 ， 執行線程可以再次進入並執行它 ， 仍然可得到符合設計時所預期的結果 。 與多執行緒併發執行的執行緒安全不同 ， 可重入強調對單一執行緒執行時重新進入同一個子程序仍然是安全的 。 可重入概念是在單執行緒作業系統的時代提出的 。 一個副程式的重入 ， 可能由於自身原因 ， 如執行了jmp或者call ， 類似於子程序的遞迴調用 ； 或者由於作業系統的中斷回應 。 UNIX系統的signal的處理 ， 即子程序被中斷處理程序或者signal處理程序調用 。 所以 ， 可重入也可稱作 “ 異步信號安全 ” 。 這裏的異步是指信號中斷可發生在任意時刻 。 重入的子程序 ， 按照後進先出線性序依次執行 。 若一個函數是可重入的 ， 則該函數應當滿足下述條件 ： 不能含有靜態 （ 全域 ） 非常量數據 。 不能返回靜態 （ 全域 ） 非常量數據的地址 。 只能處理由調用者提供的數據 。 不能依賴於單實例模式資源的鎖 。 調用 的函數也必需是可重入的 。 上述條件就是要求可重入函數使用的所有變量都保存在呼叫堆疊的目前函數棧 （ frame ） 上 ， 因此同一執行線程重入執行該函數時加載了新的函數幀 ， 與前一次執行該函數時使用的函數幀不衝突 、 不互相覆蓋 ， 從而保證了可重入執行安全 。 多 「 用戶 / 對象 / 進程優先級 」 以及多進程 （ Multiple processes ） ， 一般會使得對可重入代碼的控制變得複雜 。 同時 ， IO代碼通常不是可重入的 ， 因爲他們依賴於像磁盤這樣共享的 、 單獨的 （ 類似編程中的靜態 、 全域 ） 資源 。 可重入性是函數程式語言的關鍵特性之一 。