若一个函数是可重入的,则该函数:
(1) 不能含有静态(全局)非常量数据
(2) 不能返回静态(全局)非常量数据的地址
(3) 只能处理由调用者提供的数据
(4) 不能依赖于单实例模式资源的锁
(5) 不能调用(call)不可重入的函数(调用的函数必须满足前面的要求)
(6) 多“用户、对象、进程优先级”以及多进程,一般会使得可重入代码变得复杂。同时I/O代码通常时不可重入的,因为他们依赖于像磁盘这样共享的、单独的资源
(7) 在和硬件发生交互的时候,切记执行类似Disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用OS_ENTER_KERNAL/OS_EXIT_KERNAL来描述。//这是临界区保护
(8) 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。
等等吧,总之,时刻记住一句话:保证中断是安全的!
与线程安全的关系
可重入与线程安全都关系到函数处理资源的方式。但他们有一定的区别,可重入观念会影响到函数的外部接口,而线程安全只关心函数的具体实现
可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。
VxWorks中采取的可重入的技术有:
* 动态堆栈变量(各子函数有自己独立的堆栈空间)
* 受保护的全局变量和静态变量
* 任务变量