线程安全与可重入函数的区别

  • 线程安全:一般来讲就是一个代码块被多个并发线程反复调用时会一直产生正确的结果。
  • 如何确保线程安全:确保线程安全 主要 考虑线程之间共享变量的安全 ,每个线程私有的内容包括 :线程id,errno变量,栈空间,寄存器,信号屏蔽字,调度 优先级。所以 属于同一进程的不同线程会共享全局区和堆,在对这些 共享变量进行访问时要保证线程安全需要采用加锁的方式,否则线程是不安全的会导致程序出错,甚至崩溃。
  • 可重入函数:在多线程或有异常控制流的情况下某个函数运行到中途时有可能被打断去运行“其他函数”,而这个“其他函数”有可能就是他本身,如果在这种情况下这个“其他函数”能够正确运行,并且处理完成后之前暂停的函数也能够正确的运行,那么这个函数就是可重入的。就像当前某个进程正在执行函数FUN()收到一个信号,从而暂停当前正在执行的 函数区 处理信号 ,而信号被重定义,因而执行信号处理函数而这个信号处理函数就是FUN()函数本身,信号处理函数能够产生正确的结果,并且处理完成后暂停FUN()函数本身也能运行出正确的结果,这种情况的函数就是上述的可重入函数。
  • 可重入函数满足的条件:
    不在函数中使用全局或静态变量
    不返回全局 或静态变量,数据都由函数调用者提供。
    使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据
    不调用不可重入函数
    线程 安全与不可重入 函数的区别:可重入函数一定是线程安全的 ,但是线程安全函数不一定是可重入的 。
    它们之间的关系如下图:
    这里写图片描述
    为什么线程安全函数不一定是可重入的呢?
    因为一个函数可以通过加锁来保证操作的原子性从而保证线程安全 ,但它可以是不可 重入的。
    参考文献:http://blog.csdn.net/miaoshaohoa/article/details/9618481
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值