可重入函数与线程安全


一、概念

线程安全(Thread-Safe):被多个并发的线程反复调用时,他会产生正确的结果。

可重入(Reentrant):当被多个线程调用的时候,不会引用任何共享数据。

      任何线程不安全问题的根源都是“共享数据”。所以,不使用任何共享数据的函数(即:可重入函数)肯定是线程安全的。但这并不等于说,线程安全函数就是可重入函数。 可重入和线程安全是两个不同的概念:可重入函数一定是线程安全的;线程安全的函数可能是重入的,也可能是不重入的;线程不安全的函数一定是不可重入的。它们之间的关系可以用下图来展现:
二、可重入函数与不可重入函数
可重入函数的特点:
①多次调用不会出错,因此,可重入函数不用担心数据的被破坏;
②在任何时候都可以被中断,一段时间后还可以继续运行而不必担心数据被破坏;
③可重入函数只使用局部变量,即保存在cpu寄存器或堆栈中,或者如果要使用全局变量要对全局变量加以保护。

不可重入函数的特点:
满足以下任意一点都是不可重入函数:
①调用了malloc/free函数,因为malloc是用全局链表来管理堆的;
②调用了标准I/O库函数,因为标准I/O的很多实现都是以不可重入的方式使用全局的数据结构的;
③可重入体内使用了静态数据结构。

三、可重入函数与线程安全的区别与联系

(1)线程安全是在多个线程情况下引发的,而可重入函数可以在只有一个线程的情况下来说。

(2)线程安全不一定是可重入的,而可重入函数则一定是线程安全的。

(3)如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。

(4)如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。(因此也不能只通过简单的加锁来使一个不可重入函数变成可重入函数)

(5)线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作互不影响使结果是相同的。

总结:


1. 可重入函数是对函数相当严格的要求,绝大部分函数都不是可重入的。
2. 可重入和线程安全的本质的区别就在于,可重入函数要求即使在同一个线程中任意地进入两次以上,也能正确执行。
3.大家常用的malloc函数是一个典型的不可重入函数,但是是线程安全函数,这就说明,我们可以方便的在多个线程中同时调用malloc,但是,如果将malloc函数放入信号处理函数中去,这是一件很危险的事情。
4. 可重入函数肯定是线程安全函数,线程安全函数不一定是可重入函数。






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值