线程安全与可重入函数

来源:互联网 发布:方媛 淘宝店 编辑:程序博客网 时间: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、如果对临界资源加锁,则是线程安全的,如果重入函数的话前一个执行流还未解锁,那么会造成死锁,所以不是可重入函数