不可重入函数总结
2016-04-11 12:59
232 查看
1.malloc,free, printf均是不可重入函数(意味不能在中断函数或信号处理函数同时调用),但是线程安全函数(意味它可以被多个线程调用)
2.函数有static变量或者全局变量,则该函数是不可重入函数
满足下面条件之一的多数是不可重入函数:
(1)使用了静态数据结构或者全局变量;
(2)调用了malloc或free;
(3)调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全局数据结构。
(4)进行了浮点运算.许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现。
(5)调用printf。
mallo函数和printf函数实现
1.引用了全局变量 --- printf引用全局stdout, malloc,free会引用全局的内存分配表
2.调用了semtake --- 在VxWorks源代码的函数memPartAlignedAlloc内存在这样一行代码semTake (&partId->sem, WAIT_FOREVER);它通过获取分区锁来保证内存申请操作的线程互斥,因此,在ISR内调用malloc会导致OS重复调用调度器函数reschedule出现中断重入。printf内部也包含了semTake操作,中断服务程序中不能有阻塞操作。
可重入和线程安全(Thread-Safe)是两个不同的概念:可重入函数一定是线程安全的;线程安全的函数可能是重入的,也可能是不重入的;线程不安全的函数一定是不可重入的。
rentrant函数与是不是多线程无关,如果是reentrant函数,那么要求即使是同一个进程(或线程)同时多次进入该函数时,该函数仍能够正确的运作.
该要求还蕴含着,如果是在多线程环境中,不同的两个线程同时进入该函数时,该函数也能够正确的运作.
thread safe函数是与多线程有关的,它只是要求不同的两个线程同时对该函数的调用在逻辑上是正确的.
不可重入的非法调用例子:
1. 定义一个每微妙触发的定时器,触发时产生alarm信号,在信号处理函数中调用malloc/free,程序主循环也调用malloc/free--这样程序就死锁了。
2.函数有static变量或者全局变量,则该函数是不可重入函数
满足下面条件之一的多数是不可重入函数:
(1)使用了静态数据结构或者全局变量;
(2)调用了malloc或free;
(3)调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全局数据结构。
(4)进行了浮点运算.许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现。
(5)调用printf。
mallo函数和printf函数实现
1.引用了全局变量 --- printf引用全局stdout, malloc,free会引用全局的内存分配表
2.调用了semtake --- 在VxWorks源代码的函数memPartAlignedAlloc内存在这样一行代码semTake (&partId->sem, WAIT_FOREVER);它通过获取分区锁来保证内存申请操作的线程互斥,因此,在ISR内调用malloc会导致OS重复调用调度器函数reschedule出现中断重入。printf内部也包含了semTake操作,中断服务程序中不能有阻塞操作。
可重入和线程安全(Thread-Safe)是两个不同的概念:可重入函数一定是线程安全的;线程安全的函数可能是重入的,也可能是不重入的;线程不安全的函数一定是不可重入的。
rentrant函数与是不是多线程无关,如果是reentrant函数,那么要求即使是同一个进程(或线程)同时多次进入该函数时,该函数仍能够正确的运作.
该要求还蕴含着,如果是在多线程环境中,不同的两个线程同时进入该函数时,该函数也能够正确的运作.
thread safe函数是与多线程有关的,它只是要求不同的两个线程同时对该函数的调用在逻辑上是正确的.
不可重入的非法调用例子:
1. 定义一个每微妙触发的定时器,触发时产生alarm信号,在信号处理函数中调用malloc/free,程序主循环也调用malloc/free--这样程序就死锁了。
相关文章推荐
- C++第3次上机实验-个人所得税计算机
- 计算机视觉和人工智能的状态:我们已经走得很远了 The state of Computer Vision and AI: we are really, really far away.
- Android 环境变量
- JScrollPane自动乡下滚动
- block,inline和inline-block概念和区别
- 0、mac下安装mysql
- Scrapy设置之深入
- python的使用环境总结
- python的使用环境总结
- BroadcastReceiver
- jxl和POI的区别
- 量化Hacker News 中50天的数据 Quantifying Hacker News with 50 days of data
- poj-1276 Cash Machine(多重背包)
- VS2013常用快捷键
- 基于ZooKeeper的分布式Session实现
- 矩阵快速幂模板
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- 最详细的mac下Android studio配置gradle的路径
- EJB实体Bean怎样和数据库中表关联?
- 阿里Android一面(校招)