1、Code Review

参考:
https://www.cnblogs.com/wdpp/archive/2011/01/17/2386823.html

2、用到的

1、函数可重入冲突检查

(1)线程安全:全局变量及静态变量

线程安全:一般来讲就是一个代码块被多个 并发线程反复调用时会一直产生正确的结果。

1 线程安全问题都是由全局变量及静态变量引起的。任何未使用静态数据或其他共享资源的函数都是线程安全的。而使用全局变量或静态局部变量的函数是非线程安全的。
2 使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。
3 线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。

(2)可重入函数:

1、函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次有别的线程进入该函数,这称为重入
2、访问时有可能因为重入而造成错乱,像这样的函数称为不可重入函数,反之,如果一个函数只访问自己的局部变量或参数,则称为可重入函数。
3、可重入函数特点:函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会发生数据错误。

可重入函数的条件
1.不在函数内部使用静态或全局数据
2.不返回静态或全局数据,所有数据都有函数的调用者提供
3.使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据
4.不调用不可重入函数

(3)可重入函数和线程安全的联系与区别

可重入函数与线程安全并不相同,一般来说,可重入的函数一定是线程安全的,但反过来不一定成立,关系可由下图解释:

(1)如果一个函数中不加锁的用到了全局或静态变量,那么它不是线程安全的,也不是可重入的
(2)如果我们对它加以改进,在访问全局或静态变量时使用互斥量或信号量等方式加锁,则可以使它变成线程安全的,但此时它仍然是不可重入的,
因为通常加锁方式是针对不同线程的访问,而对同一线程可能出现问题;
(3)如果将函数中的全局或静态变量去掉,改成函数参数等其他形式,则有可能使函数变成既线程安全,又可重入

记住:

1.可重入概念只和函数访问的变量类型有关,和是否使用锁没有关系。
2.而线程安全和锁的使用关系密切,很多时候线程安全是靠锁来保证的

参考:
https://blog.csdn.net/hj605635529/article/details/71080117

posted on 2022-03-09 18:36  西伯尔  阅读(25)  评论(0编辑  收藏  举报