可重入函数
在多线程条件下,函数应当是线程安全的,进一步,更强的条件是可重入的。
一个可重入函数保证了在多线程条件下,函数的状态不会出现错误。
eg. (in c)
static int tmp;
void swap1(int* x, int* y) {
tmp=*x;
*x=*y;
*y=tmp;
}
void swap2(int* x, int* y) {
int tmp1;
tmp1=*x;
*x=*y;
*y=tmp1;
}
swap1是不可重入的,swap2是可重入的。因为在多线程条件下,操作系统会在swap1还没有执行完的情况下,切换到另一个线程中,那个线程可能再次调用swap1,这样状态就错了。
一个函数如果满足以及下条件之一,那么它是不可重入的:
- 函数中使用了静态变量,无论是全局静态变量还是局部静态变量。
- 函数返回静态变量。
- 函数中调用了不可重入函数。
- 函数是singleton中的成员函数而且使用了不使用线程独立存储的成员变量
总的来说,如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的
什么是可重入性?
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
可重入函数:
- 不为连续的调用持有静态数据。
- 不返回指向静态数据的指针;所有数据都由函数的调用者提供。
- 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
- 绝不调用任何不可重入函数。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
Ceva与扬智科技宣布建立战略合作关系
特朗普考虑对芯片征收300%的关税
集成电流传感器MAX472的典型应用电路
windml在pc486目标机上的运行问题
集成电流传感器UCC3926的典型应用电路
Proximus Global旗下公司Telesign与PCI Pal合作 助力企业提前发现支付欺诈行为
英伟达采用赛迪斯功率分析工具重新生产 Rubin 芯片
“D12 Smart USB开发实验板”销售说明
共同学习VxWorks
分析FPGA收发器的互操作性和信号完整性
在Arria II GX收发器FPGA上实现PCIe、XAUI和3G-SDI
“DP-MCU_Xilinx与DP-MCU_Altera下载开发实验仪...
使用1080p视频工作台,加速您的视频格式转换
用门电路组成的运动方向传感器(CD4011)
(最新)智能卡水表模块解决方案
2025世界机器人大会:“数”说大会 硕果累累
以爱的名义,我们同居(转帖)值得一看哦。
应用材料公司发布2025财年第三季度财务报告
TI用在工业里的Sigma-Delta调制器
由集成电流传感器MAX471构成±3A电流监测仪的电路
隔离式电压/电流传感器1B21的典型应用电路
“DP-51下载仿真实验仪”销售说明
中国首台商用电子束光刻机揭幕
SL811U盘读写开发板
12路1080P高清视频流,米尔RK3576开发板重塑视频处理极限
英飞凌宣布完成对Marvell汽车以太网业务的收购
采用单片FPGA支持多种工业以太网协议
1500家原厂直供、100万工程师首选!世强硬创何以成为“不可替代”的电子研发底座?
(第一二章)《深入浅出LPC9401 Flash单片机》
有关汉字显示问题