转载请注明出处:jiq•钦'stechnical Blog
1函数的可重入性:
单线程环境:
可重入的函数,最开始是出现在单线程环境中,一个线程正在执行一个函数,此时发生一个中断,转而执行中断处理程序,如果中断处理程序执行结束回到当前函数继续执行不会出现不一样的结果,则这个函数就是可重入的。因为中断处理程序中可以再次调用该函数,也可能修改该函数用到的共享数据等,所有这些行为都可能导致该函数恢复执行后出现不一样的结果。
多线程环境:
多线程环境下,函数的可重入意味着该函数可以同时由多个任务调用,而不会产生任何错误。可重入的函数不需要考虑线程安全问题,因为其不会引用任何共享数据。
可重入函数需满足几个条件:
1、不能含有静态(全局)非常量数据
2、不能返回静态(全局)非常量数据的地址。
3、只能处理由调用者提供的数据。
4、不能依赖于单实例模式资源的锁。
5、不能调用不可重入的函数(如malloc,free等)。
可重入是线程安全的子集,即可重入函数一定线程安全。但是反过来不是。
因为一个函数如果线程安全,同样可以使用全局资源,只要做好线程间同步即可。
但是它不一定是可重入的,一旦使用了全局资源,调用此函数的时候发生中断,中断处理函数中又再次调用此函数修改了全局资源,ISR执行完后再回到函数就会发现数据不一致的情况了!!!
2 互斥锁的可重入性
可重入还有另外一层含义,在java中互斥锁是可重入的,即如果一个线程获得了一个对象的互斥锁,对于该对象的所有互斥方法,都可以进入而不需要重新获得锁。