可重入 若一個程序或子程序可以在任意時刻被中斷然後作業系統調度執行另一段程式碼這段程式碼又使用了該副程式不會出錯則稱其為可重入reentrant 或 reentrant的即當該副程式正在運作時執行线程可以再次進入並執行它仍然可得到符合設計時所預期的結果與多執行緒併發執行的线程安全不同可重入強調對單一執行緒執行時重新進入同一個子程序仍然是安全的 可重入概念是在單執行緒作業系統的時代提出的一個子程序的重入可能由於自身原因如執行了jmp或者call類似于子程序的遞迴调用或者由於作業系统的中斷回應UNIX系统的signal的处理即子程序被中断处理程序或者signal处理程序调用所以可重入也可称作异步信号安全这里的异步是指信号中断可发生在任意时刻 重入的子程序按照后进先出线性序依次执行 若一个函数是可重入的則该函数應當满足下述条件 不能含有静态全域非常量数据 不能返回静态全域非常量数据的地址 只能处理由调用者提供的数据 不能依赖于单例模式资源的锁 调用call的函数也必需是可重入的 上述条件就是要求可重入函数使用的所有变量都保存在呼叫堆疊的目前函数栈frame上因此同一执行线程重入执行该函数时加载了新的函数帧与前一次执行该函数时使用的函数帧不冲突不互相覆盖从而保证了可重入执行安全 多用户对象进程优先级以及多元處理Multiple processes一般会使得对可重入代码的控制变得复杂同时IO代码通常不是可重入的因为他们依赖于像磁盘这样共享的单独的類似編程中的靜態全域资源 可重入性是函数式编程的關鍵特性之一