线程安全与可重入函数对比

来源:互联网 发布:什么咖啡最提神知乎 编辑:程序博客网 时间:2024/05/31 18:51

线程安全:
线程是系统调度的最小单元,进程是资源分配的最小单元,通常一个进程可以派生出多个线程,各线程间之间相互独立,共享系统资源,提高了CPU的利用率。

线程主要由控制流程和资源使用两部分构成,因此一个不得不面对的问题就是对共享资源的访问。为了确保资源得到正确的使用,开发人员在设计编写程序时需要考虑避免竞争条件和死锁,需要更多地考虑使用线程互斥变量。

线程安全 (Thread-safe) 的函数就是一个在代码层面解决问题比较好的方法,也成为多线程编程中的一个关键技术。如果在多线程并发执行的情况下,一个函数可以安全地被多个线程并发调用,结果依然正确,可以说这个函数是线程安全的。反之,则称之为“非线程安全”函数。

有这么四类函数称为线程不安全的:
1、不保护共享变量的函数;
2、函数状态随着调用改变的函数;
3、返回指向静态变量指针的函数;
4、调用线程不安全函数的函数;

避免:
1、 减少对临界资源的依赖,尽量避免访问全局变量,静态变量或其它共享资源,如果必须要使用共享资源,所有使用到的地方必须要进行互斥锁 (Mutex) 保护。

2、线程安全的函数所调用到的函数也应该是线程安全的,如果所调用的函数不是线程安全的,那么这些函数也必须被互斥锁 (Mutex) 保护。
这里写图片描述

编译运行:
这里写图片描述

这里写图片描述
发现运行结果并不是10000,每次运行结果都不一样,可见线程是不安全的。

可重入函数:
当一个执行流因为异常或者被内核切换而中断正在执行的函数而转为另外一个执行流时,当后者的执行流对同一个函数的操作并不影响前一个执行流恢复后执行函数产生的结果,我们就称这个函数为可重入函数。

如果一个函数符合以下条件之一则是不可重入的:
(1)调用了malloc或free,因为malloc也是用全局链表来管理堆的。
(2)调用了标准I/O库函数。标准I/O库的很多实现都以不可重入的方式使用全局数据结构。
下面给出一个不可重入函数的例子:
这里写图片描述

运行结果:

这里写图片描述
正确结果为3,但在g_val为2时Ctrl+C,会出现错误,接收到一个2号信号,会继续执行+1操作,该例中的fun函数是不可重入函数

可重入与线程安全联系和区别:
1、线程安全是在多线程情况下引发的,而可重入函数可以在只有一个线程的情况下发生;
2、线程安全不一定是可重入的,而可重入函数一定是线程安全的;
3、如果一个函数有全局变量,则这个函数不是线程安全也不是可重入的;
4、如果一个函数中的数据全是自身栈空间的,则这个函数既是线程安全也是可重入的;
5、如果将对临界资源的访问加锁,则这个线程是安全的,若重入函数加锁还未释放,则为不可重入。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑变成英文了怎么办 3dsmax英文版怎么办 手机设置越南文怎么办 电脑没有dvd驱动器怎么办 w7副本不是正版怎么办 win7硬盘速度慢怎么办 光盘装不了系统怎么办 winxp忘记开机密码怎么办 上班心里压力大怎么办 应聘人事没经验怎么办 有了撤药综合症怎么办 贯籍填写错误怎么办 没有想法的人怎么办 蜜蜂越来越少怎么办呢 眯眼睛了怎么办教案 小孩迷眼睛了怎么办 英语怎么办怎么搜题 倒车影像出现cam怎么办 贷款没有固定电话怎么办 公司要调动工作怎么办 不去厂里上班怎么办 我该怎么办英文怎么说 丝质裙子勾丝怎么办 饵料没有拉丝粉怎么办 被辞退了社保怎么办 发现工作不适合自己怎么办 找不到合适的工作怎么办 试用期不想干了怎么办 因为腰疼想调换工作怎么办 笔记本电脑开机出现英文怎么办 ios描述文件失效怎么办 pra抗体一类高怎么办 字段不能为null怎么办 电脑串口被占用怎么办 该卡未初始化怎么办 约好面试去不了怎么办 公司网速被限制怎么办 工地包工头欠钱怎么办 班里有人带钱丢了怎么办? 平安fna降到na怎么办 win10内存占用率过高怎么办