线程安全和可重入函数

线程安全问题
1.线程安全问题:
当用线程编写程序时,必须小心地编写那些具有称为线程安全性(thread safety)属性的函数。多线程访问运行时,当一个线程访问数据时采用加锁机制,对数据进行保护,保证了数据不会出现错乱。
2.产生线程不安全的原因:
多线程程序对全局变量或者静态变量进行修改。
3.以下几类函数是线程不安全的:
1)返回指向静态变量指针的函数;
2)函数状态随着调用改变的函数;
3)不保护共享变量的函数;
4)调用线程不安全函数的函数;
4.确保线程安全:
要确保线程安全,首先要考虑到线程之间的共享数据。属于同一进程的不同线程只有自己独有的私有栈与寄存器,公共分享占有堆与全局区,因此对于一般进程中的线程之间,局部变量是私有的,而静态局部变量,全局变量,分配在堆上的数据时共有的,因此针对这些数据的操作需要进行加密。
可重入函数:
当程序在执行一个函数过程中,收到信号,则立即停止对该函数的执行,并且恰好程序收到的信号为执行该函数,这就完成了所谓的重入,如果该函数此时能正常的运行,并且在执行结束后,之前暂停的函数还能运行下去,则称为该函数是可重入函数。
可重入函数是线程安全函数的一种,其特点是被多个线程调用时,不会引用任何共享的数据,函数是可重入(reentrant)的,是指对于相同的(并且合法的)函数参数(包括无参函数的情况),多次调用此函数产生的行为是可预期的,即函数的行为一致,或者结果相同。不能保证这一点的函数称为不可重入(non-reentrant)函数。这里写图片描述
•可重入特点
由于可重入函数多次调用不会出错,因此可重入函数不用担心数据会被破坏。可重入函数任何时候都可以被中断,一段时间后又可以运行,而相应的数据不会丢失。可重入函数只使用局部变量,即保存在CPU寄存器或者堆栈中;或者如果使用全局变量时,则要对全局变量予以保护。
•不可重入特点
如果一个函数符合以下条件之一的,则是不可重入的:
(1)调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的。
(2)调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构。
(3)可重入体内使用了静态的数据结构
线程安全和可重入函数的联系和区别
1.函数是可重入的,线程是安全的。但是线程安全不能说明是可重入函数。
2.如果该程序有全局变量,那么线程是不安全的,也不是可重入函数。
3.线程安全是在多个线程情况下引发的,而可重入函数可以在只有一个线程的情况下来说。
4.线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作互不影响使结果是相同的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值