https://zh.wikipedia.org/wiki/%E5%8F%AF%E9%87%8D%E5%85%A5

可重入:顾名思义 可以重复进入

  若一个程序或子程序可以“在任意时刻呗中断然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入(reentrant或re-entrant)的。

  即当该子程序正在运行时,执行线程可以再次进入并执行它,仍然获得符合设计时预期的结果。与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。

  可重入概念是在单线程操作系统时代提出的。一个子程序的重入,可能由于自身原因,如执行了jmp或者call类似与子程序的递归调用;或者由于操作系统的中断响应,UNIX系统的signal的处理,即子程序呗中断处理程序或者signal处理程序调用。所以,可重入也可承做‘异步信号安全’。这里的异步是指信号中断可发生在任意时刻。重入的子程序,按照后进先出线性序依次执行。

  若一个函数是可重入的,则该函数应满足下述条件:

    1、不能含有静态(全局)非常量数据。

    2、不能返回静态(全局)非常量数据的地址。

    3、只能处理由调用者提供的数据。

    4、不嫩更依赖于单实例模式资源的锁。

    5、调用(call)的函数也必须是可重入的。

  上述条件可是要求可重入函数使用的所有变量都保存在调用栈的当前函数帧(frame)上,因此同一执行线程重入执行该函数时加载了新的函数帧,与前一次执行该函数时使用的函数帧不冲突、不互相覆盖,从而保证了可重入执行安全。

 

多“用户/对象/进程优先级”以及多进程(Multiple Process),一般会使得对可重入代码的控制变得复杂。同时,IO代码通常不是可重入的,因为他们依赖于像磁盘这样共享的、单独的(类似编程中的静态、全域)资源。

 

 

 

 

 

你可能感兴趣的:(编程语言概念)