代码中的软件工程
参考资料:https://gitee.com/mengning997/se/blob/master/README.md#%E4%BB%A3%E7%A0%81%E4%B8%AD%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B
一.C/C++编译调试环境配置 Based on Visual Studio Code
1.下载 the Microsoft C/C++ extension

2.安装Mingw-w64,添加环境变量后,打开CMD,执行gcc -v看看是否安装成功

3.创建tasks.json launch.json 文件 并对其进行相应修改。
二.模块化软件设计
1.模块化的基本原理
模块化(Modularity)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独立地进行设计和开发。这个做法背后的基本原理是关注点的分离。关注点的分离的思想背后的根源是由于人脑处理复杂问题时容易出错,把复杂问题分解成一个个简单问题,从而减少出错的情形。
2.模块化代码的基本写法
命令行菜单在开源社区中常见的写法,将数据结构和它的操作与菜单业务处理进行分离处理,尽管还是在同一个源代码文件中,但是已经在逻辑上做了切分,可以认为有了初步的模块化。

程序首先在分成 linktable(数据结构和它的操作)、menu(菜单业务处理) 两大模块,每个模块的.c文件里是函数的定义 完成模块的具体实现, 模块的.h头文件是相关函数的声明 作为模块对外接口。如下图所示:

三.可重用软件设计
1.接口概念
接口就是互相联系的双方共同遵守的一种协议规范,在我们软件系统内部一般的接口方式是通过定义一组API函数来约定软件模块之间的沟通方式。换句话说,接口具体定义了软件模块对系统的其他部分提供了怎样的服务,以及系统的其他部分如何访问所提供的服务。
2.接口规格的五大基本要素
- 接口的目的;
- 接口使用前所需要满足的条件,一般称为前置条件或假定条件;
- 使用接口的双方遵守的协议规范;
- 接口使用之后的效果,一般称为后置条件;
- 接口所隐含的质量属性。
以如下函数接口代码为例说明接口规格的五个基本要素

该接口的目标是从链表中取出链表的头节点,函数名GetLinkTableHead清晰明确地表明了接口的目标;
该接口的前置条件是链表必须存在使用该接口才有意义,也就是链表pLinkTable != NULL;
使用该接口的双方遵守的协议规范是通过数据结构tLinkTableNode和tLinkTable定义的;
使用该接口之后的效果是找到了链表的头节点,这里是通过tLinkTableNode类型的指针作为返回值来作为后置条件,C语言中也可以使用指针类型的参数作为后置条件;
该接口没有特别要求接口的质量属性,如果搜索一个节点可能需要在可以接受的延时时间范围内完成搜索
3.通用接口定义的基本方法
参数化上下文
移除前置条件
简化后置条件

可以看出linktable模块的接口 都使用参数化上下文,前置条件较少,后置条件较为简化,所以linktable模块的接口都比较通用。
四. 线程安全
1. 线程安全概念
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全
2.函数的可重入性与线程安全之间的关系
2.Linktable软件模块的线程安全分析
可重入的函数不一定是线程安全的,可能是线程安全的也可能不是线程安全的;可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题;不可重入的函数一定不是线程安全的。

在 Linktable链表的数据结构中包含pthread_mutex_t mutexf 互斥锁用于对临界区的互斥访问

在CreateLinkTable()函数中 用pthread_mutex_init对互斥锁mutex初始化 和解锁;

在DeleteLinkTable函数中 ,链表节点的删除操作代码 之前用pthread_mutex_lock(&(pLinkTable->mutex))进行上锁,之后用pthread_mutex_unlock(&(pLinkTable->mutex))解锁,避免线程同时对链表节点进行操作,实现线程安全。在彻底删除链表之前使用pthread_mutex_destroy销毁互斥锁mutex。

在AddLinkTableNode函数中,插入节点代码 之前进行上锁 之后进行解锁,避免其它线程对链表同时操作,导致数据错误。

浙公网安备 33010602011771号