线程安全与可重入函数
来源:互联网 发布:方媛 淘宝店 编辑:程序博客网 时间:2024/06/06 02:02
可重入函数:
当一个函数被多个执行流重复进入的函数,叫重入。
因为重入导致结果错误的函数,叫做不可重入函数。例如在进行无头结点单链表的插入操作时,当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、如果对临界资源加锁,则是线程安全的,如果重入函数的话前一个执行流还未解锁,那么会造成死锁,所以不是可重入函数
- 线程安全与可重入函数
- 线程安全与可重入函数
- 可重入函数与线程安全
- 可重入函数与线程安全
- 线程安全与可重入函数
- 可重入函数与线程安全
- 可重入函数与线程安全
- 可重入函数与线程安全
- 可重入函数与线程安全
- 线程安全与可重入函数
- 线程安全与可重入函数
- 线程安全与可重入函数
- 线程安全与可重入函数
- 可重入函数与线程安全
- 线程安全与可重入函数
- 线程安全与可重入函数
- 线程安全与可重入函数
- 线程安全与可重入函数
- ThreadLocal解析
- 数据库设计的6个阶段
- Python学习02-基础语法
- java3——数据类型转换
- printf 的基本使用
- 线程安全与可重入函数
- 数学题找规律
- Django1.11.1解决 Forbidden (403) CSRF verification failed. Request aborted.
- PAT 1006. 换个格式输出整数 (15) —— Java
- iptables不完全手册
- 拥塞控制之慢开始和拥塞避免
- Java-按指定顺序执行线程
- Leetcode 239 Sliding Window Maximum
- 排序算法