文章目录
将多进程改为多线程的目的就是:服务端采用数据库连接池的方法去连接数据库,实现数据库的共享,这样就可以提升服务端的性能,响应速度也能提高。 (在修改之前,先拷贝一份服务端程序)
一、修改的注意事项
1.将创建多进程的函数改为创建多线程的函数
2.创建一个容器,存放子线程的socket
为什么要创建一个容器来存放子线程的socket呢?因为子线程的socket是局部变量,当主函数使用exit退出函数时,就不会释放局部变量。所以为了防止局部变量没有释放,每次创建一个子线程的socket连接,就将socket连接放入容器中。前面的文章有说明。
3.将原来多进程的程序的return修改为break
当一个线程出错时,我们不能采用return停止这个线程,这样会导致其他的线程也被停止。
4.makefile文件连接线程库
5.修改全局变量
多进程程序中,主要有的全局变量是业务请求参数,数据库连接对象,接收报文的缓冲区,发送报文的缓冲区。
现在要在线程的的处理主函数中将它们改为局部变量
5.1 业务请求参数
在多进程的程序中,我们将业务请求的声明和定义放在函数的外面。
现在要改为多线程,就是要将业务请求参数的结构体在函数外面声明,在函数内部定义,这样就是局部变量了。
(1)声明
(2)在线程主函数中定义
(3)将业务结构体变量作为参数传给需要到业务参数的函数
5.2 数据库连接对象
(1)将全局的数据库连接对象去掉
(2)把数据库连接对象放在线程主函数中定义
(3)修改连接数据的方式
在连接数据库之前,判断一下连接状态,如果 数据库还没有连接,就连接数据库。
(4)将数据库连接对象传到需要操作数据库的函数中
一般是传给业务处理函数,对数据进行增删查改的函数。
5.3 接收发送报文缓冲区
(1)线程主函数中定义
这两个变量是在线程主函数中有用到。那么将他们改为在线程主函数定义
(2)心跳业务中
在心跳业务中也要发送心跳报文,所以也需要发送接收报文的缓冲区(也就是buffer)。但是心跳报文不与真正的数据相关,所以可以在心跳业务中定义这个缓冲区,不用参数。
(3)真正的业务处理函数中
5.4 修改socket为局部变量
(1)将TcpServer.Read 和 TcpServer.Write 改为 tcp.Read 和 tcp.Write
在原来的多进程程序中,我们用来接收报文发送报文的函数是封装好了的TcpServer 中的Read 和 Write,但是这样改不了socket,或者说TcpServer用的是全局变量socket,而现在我们要用局部变量socket。
TcpServer.Read 是调用 tcp.Read ,TcpServer.Write 调用 tcp.Write
所以我们现在不用封装好的TcpServe,用它的下一层函数。直接用tcp.Read 和tcp.Write
(2)将socket 传给 tcp.Read 和 tcp.Write
注意这里的socket是怎么传的,是谁传的,是TCPServer传给的。