本系列文章将围绕可重入函数展开,将会涉及可重入函数的概念、要求、不可重入函数的处理等,敬请各位期待。
可重入函数
定义
- 如果计算机程序或例程在其先前的调用完成之前可以安全地再次调用,则该计算机程序或例程被称为可重入的(它可以被安全地并发执行);
- 简而言之,可重入函数的安全的,不可重入函数是不安全的。
适用场景
- 中断
如该函数在执行过程中,发生中断,ISR开始执行,之后恢复该函数的执行,所以可重入的函数,简单来说就是可以被中断的函数;ISR本身也应该是可重入的函数。
- 并发
在并发服务器中,一个函数在被多个任务调用的过程中,任务在调用时不必担心数据是否会出错。
- 递归函数
递归函数天生就会被自己打断。
满足的条件
- 不能保存静态或全局的非常量数据;
- 不能将地址返回给静态(或全局)非常量数据;
- 必须只处理调用者提供给它的数据;
- 不能依赖锁来锁定单例资源;
- 不得修改自己的代码(除非在自己独特的线程存储中执行);
- 不得调用不可重入的计算机程序或例程。
例子
- 例1、非重入函数
int x; int my_first_nonreentrant_function() { return x * 10; } int my_second_nonreentrant_function() { return my_function() * 20; }
- 例2、可重入函数
int my_first_reentrant_function(int x) { return x * 10; } int my_second_reentrant_function(int x) { return my_first_reentrant_function(x) * 20; }
实际应用
C库函数
- 有些库函数是不可重入的,使用时要格外小心,从网上找到一个表格,供参考:
- 可重入函数如下:
自己编写函数
- 了解了可重入函数的要求后,在编写可能涉及重入场景的函数时,需要严格按照要求来编写。