线程安全与可重入编写方法详解编程语言
线程安全与可重入编写方法。
1、什么是线程安全
当一个函数被多个线程反复调用的时候,他会一直产生正确的结果,那么这个函数就是线程安全的。线程安全函数解决了多个线程调用函数时访问临界资源的冲突问题。
2、可重入
在多线程或有异常控制流的情况下,当某个函数运行到中途时,控制流有可能被打断去执行另一个函数,而这”另一个函数”有可能是他本身,如果在这种情况下不会出现问题,比如与说数据或状态不被破坏,而且行为可预期,那么这个函数就被称为可重入的。反之,就是不可重入函数 。
简单来说就是:当一个函数被多个线程调用的时候,不会引用任何共享数据,那么这个函数就是可重入的。可重入函数可以在任意时刻被中断,稍后再继续运行,也不会丢失数据。反之就是不可重入。
3、线程安全与可重入的区别于联系
线程安全的根源就在于”共享数据”。所以不共享任何数据的函数(可重入函数)肯定是线程安全的。但是,即使有共享数据,线程安全还可以通过同步与互斥来保证,所以线程安全并不一定是可重入的。
关系如图:
可重入是线程安全的一个真子集,可重入一定线程安全,但线程安全不一定可重入。
4、怎样编写可重入函数
关于线程安全,我们可以通过同步与互斥来实现,下面介绍一下编写可重入函数时的规范:
1、不能在函数内部使用静态或全局数据
2、不能返回静态或全局数据,所有数据都有函数的调用者提供
3、使用本地数据、或通过制作全局数据的本地拷贝来保护全局数据。
4、如果必须访问全局变量,利用互斥机制来保护全局变量。
5、不在可重入函数内部调用不可重入函数。、
6、不调用malloc和free函数,因为malloc是用全局链表来管理堆的。
7、不调用了标准I/O函数。标准I/O函数很多都以不可重入的方式实现全局数据结构。
最常见的就是在信号处理函数中不能使用不可重入函数。如果在信号处理函数中使用了不可重入函数,则可能导致程序出现错误甚至崩溃。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/16501.html
c相关文章
- tcp/ip网络通讯安全加密方法[通俗易懂]
- Gartner总结三大云安全实施建议 附重要安全工具及风险评估方法
- springboot文件上传方法详解
- 确保数据中心物理安全的五种方法
- 【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )
- Win2003服务器高安全配置方法
- sql2000数据库清除重复数据的二种方法
- 在CentOS 7.2上安装SuPHP的详细方法
- PDO操作MySQL:学习快速又安全的方法(pdo操作mysql)
- Java非线程安全问题的解决方法
- Linux下快速安全传输数据的方法(linux传输数据)
- LINUX系统下限制IP访问的实现方法(linux限制ip访问)
- 关闭Linux防火墙:快速而安全的方法(关闭linux的防火墙)
- 给CISCO设备中后门的方法–TCL 以及路由安全
- 四种立即改善在线安全的方法
- Oracle数据库中,实现两表关联查询的技巧与方法(oracle两表关联)
- 性Oracle中实现线程安全性的方法(oracle线程安全)
- 入安全Redis保障并发写入安全的方法(redis如何保证并发写)
- Linux软连接的创建方法和注意事项(linux如何软连接)
- Linux下截取文件的方法(linux 截取文件)
- Linux快速安全保存只读文件的方法(linux保存只读文件)
- Linux下安全修改系统文件的方法(linux修改系统文件)
- Oracle中应用除法函数的方法(oracle中除法函数)
- 器安全关闭Redis服务器的方法(关闭服务器redis服务)
- 在Oracle中更新表的正确方法(oracle中如何更新表)
- 解决Redis脑裂一种安全有效的方法(redis脑裂怎么解决)
- php表单提交程序的安全使用方法
- node.js中的console.timeEnd方法使用说明
- C#判断上传文件是否是图片以防止木马上传的方法