可重入函数与线程安全

来源:互联网 发布:失物招领网站源码 编辑:程序博客网 时间:2024/06/01 11:27

可重入函数:
当程序被多个线程反复执行,产生的结果正确。如果一个函数只访问自己的局部变量或参数,称为可重入函数。
不可重入:
当程序被多个线程反复调用,产生的结果出错。
当函数访问一个全局的变量或者参数时,有可能因为重入而造成混乱,像这样的函数称为不可重入函数

如果⼀个函数符合以下条件之⼀则是不可重⼊的:
(1)调⽤了malloc或free,因为malloc也是⽤全局链表来管理堆的。
(2)调⽤了标准I/O库函数。标准I/O库的很多实现都以不可重⼊的⽅式使⽤全局数据结构。
(3)SUS规定有些系统函数必须以线程安全的⽅式实现,这⾥就不列了。

线程安全:
一般来讲就是一个代码块被多个并发线程反复调用时会一直产生正确的结果。
线程安全问题都是由全局变量及静态变量引起的。任何未使用静态数据或其他共享资源的函数都是线程安全的。而使用全局变量或静态局部变量的函数是非线程安全的。
使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。
线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。

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

(1)线程安全是在多个线程情况下引发的,而可重入函数可以在只有一个线程的情况下来说。
(2)线程安全不一定是可重入的,而可重入函数则一定是线程安全的。
(3)如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。
(4)如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。
(5)线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作互不影响使结果是相同的。

这里写图片描述

0 0
原创粉丝点击