怎么样进行一个软件模块的线程安全分析呢?
首先要逐一分析所有的函数是不是都是可重入函数;
函数有没有访问临界资源(全局变量、静态存储区等),如果有访问临界资源的话需要仔细分析竞争互斥的处理能不能有效避免临界资源冲突问题。
对于不可重入函数要具体分析其对线程安全带来的影响,有没有潜在的破坏性。实际上软件测试技术及软件质量保证体系的发展已经无奈地默许软件缺陷的存在。
然后进一步研究不同的可重入函数有没有可能同时进入临界区;
写互斥;
读写互斥;
Linktable链表的数据结构中包含pthread_mutex_t mutex用于临界区的互斥,在创建Linktable链接时使用了pthread_mutex_init初始化来mutex,清空链表之后彻底删除链表之前使用pthread_mutex_destroy销毁了mutex。
显然对链表的查询没有进行临界区互斥方面的处理。从整个软件模块看也就是写操作都是互斥的,而读写可以并行进行。我们来分析一下为什么可以读写并行。
插入链接节点是从尾部插入,而查询链表节点是从依次查找,不会出现链表在插入节点的过程中断链的瞬间;
删除节点的过程是把待删除的节点的下一个节点指针赋给上一个节点的pNext,一个指令周期内完成,也不会造成链表在删除节点的过程中断链的瞬间。
因此读写并行进行在最大程度上是线程安全的。
1.简约而不简单——代码规范和代码风格
1.1.实验项目介绍
1.2.代码风格的原则:简明、易读、无二义性
1.3.编写高质量代码的基本方法
1.3.1.通过控制结构简化代码
1.3.2.通过数据结构简化代码
1.3.3.一定要有错误处理
1.3.4.性能优先策略背后隐藏的代价
1.3.5.拒绝修修补补要不断重构代码
1.3.6.编码过程中的团队合作
1.4.测试题
2.模块化软件设计
2.1.模块化的基本原理
2.2.模块化代码的基本写法
2.3.传统单体集中式架构与微服务架构
2.4.软件设计中的一些基本方法
2.4.1.KISS原则
2.4.2.使用本地化外部接口来提高代码的适应能力
2.4.3.保持设计结构和代码结构的一致性
2.5.测试题
3.可重用软件设计
3.1.消费者重用和生产者重用
3.2.接口的基本概念
3.2.1.软件模块接口举例
3.2.2.微服务接口举例
3.2.3.接口与耦合度之间的关系
3.2.3.1.公共耦合
3.2.3.2.数据耦合
3.2.3.3.标记耦合
3.2.4.同步接口和异步接口
3.3.可重用软件模块的接口设计范例
3.3.1.通用Linktable模块的接口设计
3.3.2.给Linktable增加Callback方式的接口
3.3.3.进一步改进Linktable的Callback方式的接口
3.4.通用接口定义的基本方法
3.4.1.参数化上下文
3.4.2.移除前置条件
3.4.3.简化后置条件
3.5.测试题
4.可重入函数与线程安全
4.1.线程的基本概念
4.2.函数调用堆栈
4.3.可重入函数
4.4.什么是线程安全?
4.5.Linktable软件模块的线程安全分析
5.子系统的可重用设计
5.1.menu子系统的可重用接口设计
5.2.Makefile工程文件
5.3.带参数的复杂命令函数接口的写法
6.工程化编程实战总结
6.1.看待软件质量的几个不同角度
6.2.软件设计的方法和原则
参考资料
推荐阅读:
推荐阅读:
完整课程点击下方【阅读原文】