可重入函数

若一个函数是可重入的,则该函数:

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

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

(3)    只能处理由调用者提供的数据

(4)    不能依赖于单实例模式资源的锁

(5)    不能调用(call)不可重入的函数(调用的函数必须满足前面的要求)

(6)    多“用户、对象、进程优先级”以及多进程,一般会使得可重入代码变得复杂。同时I/O代码通常时不可重入的,因为他们依赖于像磁盘这样共享的、单独的资源

(7)    在和硬件发生交互的时候,切记执行类似Disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用OS_ENTER_KERNAL/OS_EXIT_KERNAL来描述。//这是临界区保护

(8)    谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL

等等吧,总之,时刻记住一句话:保证中断是安全的!

 

与线程安全的关系

可重入与线程安全都关系到函数处理资源的方式。但他们有一定的区别,可重入观念会影响到函数的外部接口,而线程安全只关心函数的具体实现

可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。

 

VxWorks中采取的可重入的技术有:

    * 动态堆栈变量(各子函数有自己独立的堆栈空间)

    * 受保护的全局变量和静态变量

* 任务变量

可重入函数

上一篇:Xcode中设置类库ARC支持


下一篇:PowerShell 学习_Part2_Building an inventory tool_1