可重入函数和线程安全
来源:互联网 发布:电子书语音阅读软件 编辑:程序博客网 时间:2024/05/21 21:43
可重入函数和线程安全
1.线程安全
线程安全:当一个函数被多个并发进程反复调用时,它会一直产生正确而的结果,称其为线程安全的。
若一个函数不是线程安全的,就称其为线程不安全的。
线程安全就是说多线程访问同一代码,不会产生不确定的结果。换句话说,线程安全就是多线程访问时,采用加锁机制,当一个线程访问该类的某个数据时,用锁对数据进行保护,其他线程不能访问该数据直到该线程读取完,其他线程才可使用,线程安全不会出现数据不一致或者数据污染。
我们定义四类线程不安全的函数
1)不保护共享变量(临界资源)的函数
将这类线程不安全函数可以通过P、V操作来保护共享变量(临界资源)。
优点:调用从程序中不需要进行修改
缺点:同步操作会减慢程序的执行时间
2)保持跨越多个调用的状态函数
一个伪随机数生成器就是这类线程不安全函数的例子
rand函数是线程不安全的,因为当前调用的结果依赖于前次调用的中间结果。当我们调用srang为rand设置一个种子后,我们反复从一个单线程中调用rand,能够预期一个可重复的随机数字序列。但是若有多个线程同时调用rand函数,这样的假设就会出现问题
使rand函数变为线程安全的方法是重写它。
3)返回指向静态变量指针的函数
有些函数将计算结果放在静态结构中,并返回一个指向这个结构的指针。若从并发线程中带哦用这些函数可能会发生问题,因为正在被一个线程使用的结果会被另一个线程覆盖
有两种方法处理这类线程不安全的函数。一是重写函数,使得调用者传递存放结果的结构地址,消除共享数据
二是使用lock-and-copy加锁拷贝,调用互斥锁来保护。
4)调用线程不安全函数的函数
若一个函数调用一个线程不安全的函数,则自己也会变成一个线程不安全的函数
2.可重入函数
可重入函数:可重入函数是线程安全函数的一种,特点是,它们被多个线程调用时,不会引用任何共享数据
可重入函数通常不不可重入的线程安全函数效率高一些,因为它们不需要同步操作
显式可重入函数:若所有函数的参数都是传值传递的,并且所有的数据引用都是局部变量,那么函数就是显式可重入的
隐式可重入函数:可重入函数中的一些参数是引用传递,也就是说,在调用线程传递指向非共享数据的指针时,才是可重入的。
3.可重入函数和线程安全的区别与联系
1)线程安全是在多个线程情况下引发的,而可重入函数可以只在一个线程的情况下
2)线程安全不一定是可重入的,而可重入函数则一定是线程安全的
3)如果一个函数中有全局变量,那么这个线程既不是线程安全的也不是可重入的
4)如果将对临界资源的访问上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会发生死锁,因此是不可冲入的
5)线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作互不影响使结果是相同的
- 线程安全和可重入函数
- 可重入函数和线程安全
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 线程安全和可重入函数
- 可重入函数和线程安全
- 线程安全和可重入函数
- Android 混淆问题记录can't find superclass or interface
- ListView的divider设置
- c#——switch case语句
- 脚本
- 蓝桥杯 ADV-226 算法提高 9-3摩尔斯电码
- 可重入函数和线程安全
- JDBC
- 蓝桥杯 ADV-224 算法提高 9-1九宫格
- 隐藏域遇到的问题
- 【Leetcode】从右边看二叉树
- 创建类似于微信或QQ聊天视图的Android库:ChatMessageView
- 蓝桥杯 ADV-223 算法提高 8-1因式分解
- socket编程——TCP
- 考完试