可重入函数和线程安全的区别与联系
2016-07-20 14:41
134 查看
什么是线程安全:一个函数被称为线程安全的(thread-safe),当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。反之,如果一个函数不是线程安全的,我们就说它是线程不安全的(thread-unsafe)。
所以,有这么四类函数称为线程不安全的:
不保护共享变量的函数;
函数状态随着调用改变的函数;
返回指向静态变量指针的函数;
调用线程不安全函数的函数
什么是可重入函数:可重入函数是线程安全函数的一种,其特点在于它们被多个线程调用时,不会引用任何共享数据。函数是可重入(reentrant)的,是指对于相同的(并且合法的)函数参数(包括无参函数的情况),多次调用此函数产生的行为是可预期的,即函数的行为一致,或者结果相同。不能保证这一点的函数称为不可重入(non-reentrant)函数。
它又分为这么两种:
显式可重入函数:如果所有函数的参数都是传值传递的(没有指针),并且所有的数据引用都是本地的自动栈变量(也就是说没有引用静态或全局变量),那么函数就是显示可重入的,也就是说不管如何调用,我们都可断言它是可重入的。
隐式可重入函数:可重入函数中的一些参数是引用传递(使用了指针),也就是说,在调用线程小心地传递指向非共享数据的指针时,它才是可重入的。
可见,可重入函数的可重入性是有时是调用者与被调用这共有的属性,并不只是被调用者的属性。
对比:
可重入和线程安全(Thread-Safe)是两个不同的概念:可重入函数一定是线程安全的;线程安全的函数可能是重入的,也可能是不重入的;线程不安全的函数一定是不可重入的。
可重入函数要解决的问题是,不在函数内部使用静态或全局数据,不返回静态或全局数据,也不调用不可重入函数。
线程安全函数要解决的问题是,多个线程调用函数时访问资源冲突。
函数如果使用静态变量,通过加锁后可以转成线程安全函数,但仍然有可能不是可重入的。
所以,有这么四类函数称为线程不安全的:
不保护共享变量的函数;
函数状态随着调用改变的函数;
返回指向静态变量指针的函数;
调用线程不安全函数的函数
什么是可重入函数:可重入函数是线程安全函数的一种,其特点在于它们被多个线程调用时,不会引用任何共享数据。函数是可重入(reentrant)的,是指对于相同的(并且合法的)函数参数(包括无参函数的情况),多次调用此函数产生的行为是可预期的,即函数的行为一致,或者结果相同。不能保证这一点的函数称为不可重入(non-reentrant)函数。
它又分为这么两种:
显式可重入函数:如果所有函数的参数都是传值传递的(没有指针),并且所有的数据引用都是本地的自动栈变量(也就是说没有引用静态或全局变量),那么函数就是显示可重入的,也就是说不管如何调用,我们都可断言它是可重入的。
隐式可重入函数:可重入函数中的一些参数是引用传递(使用了指针),也就是说,在调用线程小心地传递指向非共享数据的指针时,它才是可重入的。
可见,可重入函数的可重入性是有时是调用者与被调用这共有的属性,并不只是被调用者的属性。
对比:
可重入和线程安全(Thread-Safe)是两个不同的概念:可重入函数一定是线程安全的;线程安全的函数可能是重入的,也可能是不重入的;线程不安全的函数一定是不可重入的。
可重入函数要解决的问题是,不在函数内部使用静态或全局数据,不返回静态或全局数据,也不调用不可重入函数。
线程安全函数要解决的问题是,多个线程调用函数时访问资源冲突。
函数如果使用静态变量,通过加锁后可以转成线程安全函数,但仍然有可能不是可重入的。
相关文章推荐
- Jquery 获取input是否被选中,并修改状态!
- SDWebImage NSURLErrorDomain - Code = 406
- windows下qt5使用ffmpeg(不用编译源码)
- java性能分析工具
- 第14章 Linux账号管理与ACL权限设置
- leetcode338
- jquery获得下拉列表选中值和文本
- Tegra TX1 安装配置 + caffe run
- Codeforces-699A Launch of Collider
- 服务器微信支付接口笔记-(与app端对接)
- 旋转的太极图
- R语言-绘制饼图-点击链接加入群【农产品一体化解决方案】:https://jq.qq.com/?_wv=1027&k=49BAREK
- 数据类型
- HeadFirstJava——14_数据结构
- 二叉搜索树
- 选择排序
- iOS-Core Animation 核心动画高级编程/5-变换
- 【python-mysql】在ubuntu下安装python-mysql环境
- HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息(转载)
- Mysql 主键知识