频道栏目
首页 > 资讯 > 安全编程 > 正文

线程安全与可重入函数

17-06-17        来源:[db:作者]  
收藏   我要投稿

线程安全与可重入函数

可重入函数:

当一个函数被多个执行流重复进入的函数,叫重入。

因为重入导致结果错误的函数,叫做不可重入函数。例如在进行无头结点单链表的插入操作时,当node1的next指向head,head还没有指向node1时,再插入node2,node2的next指向head,head指向node2,这时,node1就会丢失。因为重入,导致结果错误了。

满足下列条件的函数多数是不可重入的:

1) 函数体内使用了静态的数据结构;

2) 函数体内调用了malloc()或者free()函数;

3) 函数体内调用了标准I/O函数。

因为重入不会导致结果错误的函数,叫做可重入函数。

可重入函数只访问自己的局部变量或参数。正是因为这些操作产生的数据都在自身的栈上,所以每次调用时,都会开辟新的栈空间,所以彼此不会影响。

线程安全:

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

当一个函数被多个并发进程 反复调用时,它产生的结果一直正确,则这个函数是线程安全的。反之,则是线程不安全的。

以下四类函数是线程不安全的:

1、不保护共享变量的函数;

2、函数状态随着调用改变的函数;

3、返回指向静态变量指针的函数;

4、调用线程不安全函数的函数;

那么,如何避免线程不安全呢?

由于线程不安全是因为多个线程同时访问同一个代码,造成的,所以解决的方法就是

1、给这块代码加上锁,保证始终只有一个线程可以访问。

2、避免使用全局变量。

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

1、线程安全是在多个线程下触发的,可重入函数是在只有一个线程下发生的。

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

3、一个函数有全局变量个,它一定不是线程安全的,也不是可重入函数的。

4、一个函数中的数据都是私有栈的,那该函数一定是可重入函数,且线程安全的。

5、如果对临界资源加锁,则是线程安全的,如果重入函数的话前一个执行流还未解锁,那么会造成死锁,所以不是可重入函数。

相关TAG标签
上一篇:Powershell调用Excel批量读取指定单元格数据并输出csv结果文件
下一篇:用react+webpack+redux+MongoDB+express写博客问题集锦
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站