调查过程中接触到reentrant函数--可重入函数,实在是太久远了,一点都记不起来了。找到了ypxing的帖子,收益很大。原文:
http://bbs.chinaunix.net/viewthread.php?tid=971102
1. reentrant函数
一个函数是reentrant的,如果它可以被安全地递归或并行调用。要想成为reentrant式的函数,该函数不能含有(或使用)静态(或全局)数据(来存储函数调用过程中的状态信息),也不能返回指向静态数据的指针,它只能使用由调用者提供的数据,当然也不能调用non-reentrant 函数.
2. thread-safe函数
Thread safety是多线程编程中的概念,thread safe函数是指那些能够被多个线程同时并发地正确执行的函数.
3. reentrant函数与thread safe函数的区别
reentrant函数与是不是多线程无关,如果是reentrant函数,那么要求即使是同一个进程(或线程)同时多次进入该函数时,该函数仍能够正确的运作.该要求还蕴含着,如果是在多线程环境中,不同的两个线程同时进入该函数时,该函数也能够正确的运作.thread safe函数是与多线程有关的,它只是要求不同的两个线程同时对该函数的调用在逻辑上是正确的.reentrant的要求比thread safe的要求更加严格.reentrant的函数必是thread safe 的,而thread safe的函数未必是reentrant的.
结论:
1. reentrant是对函数相当严格的要求,绝大部分函数都不是reentrant的(APUE上有一个reentrant函数的列表).什么时候我们需要reentrant函数呢?只有一个函数需要在同一个线程中需要进入两次以上,我们才需要reentrant函数.这些情况主要是异步信号处理,递归函数等等.(non-reentrant的递归函数也不一定会出错,出不出错取决于你怎么定义和使用该函数). 大部分时候,我们并不需要函数是reentrant的.
2. 在多线程环境当中,只要求多个线程可以同时调用一个函数时,该函数只要是thread safe的就可以了.我们常见的大部分函数都是thread safe的,不确定的话请查阅相关文档.
3. reentrant和thread safe的本质的区别就在于,reentrant函数要求即使在同一个线程中任意地进入两次以上,也能正确执行.大家常用的malloc函数是一个典型的non-reentrant但是是thread safe函数,这就说明,我们可以方便的在多个线程中同时调用malloc,但是,如果将malloc函数放入信号处理函数中去,这是一件很危险的事情.
4. reentrant函数肯定是thread safe函数,也就是说,non thread safe肯定是non-reentrant函数不能简单的通过加锁,来使得non-reentrant函数变成 reentrant函数.这个链接是说明一些non-reentrant ===> reentrant和non thread safe ===> thread safe转换的
http://www.unet.univie.ac.at/aix/aixprggd/genprogc/writing_reentrant_thread_safe_code.htm
分享到:
相关推荐
介绍 #pragma指令 reentrant函数 thread-safe函数 volatile 用法 以及位域的介绍
本文介绍了单片机中常见的中断函数调用子函数和主函数调用子函数的情况,如果同时调用会出现的问题一节解决方法。
5.如何使用 VI 的重入属性(Reentrant).doc
将 liblwgeom 函数暴露给 QGIS 处理 Tihs QGIS 插件将 liblwgeom 函数暴露给 QGIS 处理 !!!插件不适用于 postgis 2.0.* 安装!!! 由于 [1],插件仅适用于 ... 插件将与将合并的 2.1 postgis 版本一起使用 [1] [1]
LabVIEW基础教程,快速学习labview--递归与可重入VI
若一个程序或子程序可以安全的被并行执行,则称其为可重入(reentrant或re-entrant)的;即,当该子程序正在运行时,可以再次进入并执行它。若一个函数是可重入的,则该函数: 不能含有静态(全局)非常量数据。 ...
支持C51的重入函数(用关键字reentrant定义的函数)。支持动态内存分配(使用动态内存分配的任务必须使用重入栈)。 1.12.1版 2003年2月5日 修正OS_MAX_TASKS为8、16时的bug。同时修正一些小bug。 1.12.0版 2003年1...
fatfs文件系统最新代码,ff14版本。FatFs Module是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。
从分析重入堆栈的原理与不足出发,通过把8051页变量与重八问题相联系,提出基于页的重入函数,并设计一种实时性和安全性较好的基于... 为了实现重入,通常可以利用Keil C51的关键字reentrant,将函数声明为重人类型。通
精心编写的,显然是有组织,这本书涵盖了MIPS架构的基础知识,包括算法开发,数字系统,函数调用,可重入函数,内存映射I / O,异常和中断,和浮点指令。 对于在系统,系统开发,系统的分析和系统维护领域的员工。 ...
/* 电平模拟函数和基本读写函数 void IIC_Start(void); void IIC_Stop(void); void SEND_0(void); void SEND_1(void); bit Check_Acknowledge(void); void Write_Byte(uchar b)reentrant; bit Write...
Reentrant ReadWrite Synchronizers Latches Semaphores Barriers Synchronized Collections Concurrent Collections CopyOnWriteArrayList ConcurrentHashMap Blocking Queue Executors Fixed Thread ...
容器类是隐式共享(implicitly)的,可重入(reentrant)的和线程安全的。并且在速度上进行了优化,内存占用少,内联代码扩展少,从而可以产生更小的可执行文件。 为容器遍历提供了两种迭代器(Java-style,STL-style)...
_REENTRANT_ -lpthread 线程通信: 同步,互斥 全局变量 无名信号量(内存信号量): sem_t, p, v, 互斥锁:pthread_mutex_t 进程: Fork()/ execve();// system(); 进程内存空间 环境变量: 从哪里来, 放在...
主要介绍了ReentrantLock 互斥锁,在同一时间只能被一个线程所占有,在被持有后并未释放之前,其他线程若想获得该锁只能等待或放弃,需要的朋友可以参考下
根据DNS服务器列表解析出服务器IP的工具源码
void Task1(void *nouse) reentrant; void Task2(void *nouse) reentrant; void Task3(void *nouse) reentrant; void DecTochar(unsigned int n,unsigned char *buf) { unsigned char i; unsigned char buffer[8]...
基于zookeeper的不可重入锁Shared Lock 举例,可重入锁Shared Reentrant Lock 举例,可重入读写锁Shared Reentrant ReadWriteLock 举例
• Object locking mechanism: safe hardware access to prevent multiple spurious accesses to shared resources. • Timeout used for all blocking processes: the timeout can be a simple counter or a time...
Reentrant Functions Section 10.7. SIGCLD Semantics Section 10.8. Reliable-Signal Terminology and Semantics Section 10.9. kill and raise Functions Section 10.10. alarm and pause ...