保存用户的连接信息和线程安全问题

72 阅读1分钟

假设有2个用户,用户1要把他的id和要发送的内容给用户2,用户1需要先把自己的id和所要发送的内容都发送给服务器了,服务器再主动地去给用户2去推送这条消息,但是用户2不知道什么时候被推送消息,不可能去服务器上拉消息,所以这个消息肯定是服务器退给用户2。所以聊天服务器必须是长连接服务器,因为不仅仅是客户端请求,还有服务器主动推送消息到客户端。 所以我们拿到用户2的id号,需要获取这个用户和服务器的连接connection,我们在业务层要想办法,一个用户一个connection,登录成功,连接就建立成功了,这个连接就可以存储下来。

网络模块中的onMessage方法就是在不同的工作线程中被回调的,当多个用户同时登录时会有多个线程同时写userConnMap,然后C++ STL中的容器没有考虑过线程安全,我们需要对userConnMap进行线程互斥

1. 添加互斥锁connMutex和存储连接的哈希表userConnMap

在include/server/chatservice.hpp的添加

image.png

2. 在登录成功的代码段添加线程安全的记录连接代码

在src/server/chatservice.cpp添加

image.png

编译

image.png