首页 > 编程语言 >C++聊天集群服务器解决客户端注销登录问题

C++聊天集群服务器解决客户端注销登录问题

时间:2023-12-20 11:36:50浏览次数:39  
标签:主线 阻塞 C++ 线程 服务器 recv 客户端

客户端如何处理注销登录问题?

问题描述:

​ 在客户端登录后进行注销选择,然后重新登录刚才注销的账号,直接卡死。注意这是概率发生,因为是主线程和子线程抢服务器发送的信息,只有子线程抢到才会发生卡死

问题产生原因分析:

image-20231219221403259

image-20231219221732886

​ 前置条件:主线程循环等待用户输入选择(第一张图是死循环,send后立马recv),子线程阻塞等待服务器数据。

​ 在客户端注销账号之前,我们启动了一个子线程来充当接收线程,阻塞等待服务器数据。当客户端注销账号后,并没有立马关闭子线程,然后立马重新登录,这时主线程会组装一个json数据发给服务器,服务器处理完后发送处理结果回客户端,此时当子线程竞争过主线程,抢到recv接收数据,但是子线程并没有处理相应的措施,因此一次循环后马上又阻塞在recv函数,而主线程因为一直未收到数据,因仍然阻塞在recv函数,所以造成了客户端死机的现象。

排查过程:

​ 使用命令

gdb attach pid(阻塞的进程id号)

​ 进入调试状态,然后

info threads 

​ 查看客户端的两个线程信息,发现两个线程都阻塞在recv函数上然后使用命令

bt

​ 打印线程调用堆栈,发现主线程阻塞在send函数后紧接的recv函数上,切换线程

thread 2

​ bt打印子线程堆栈信息,发现阻塞在readHandler里的recv上。

如何处理?

​ 在之前的流程里,并没有很好的实现两个线程之间的业务分离,导致后面两个线程争抢数据。因此,我们彻底把两个线程的业务利用信号量来分离,主线程就负责和用户交互和发送数据给服务器,子线程就只接收服务器数据,然后处理,并且把处理结果发送给主线程,这样就实现了两个线程的分离。

​ 如图:

image-20231220111900861

​ 我们在主线程发送数据给服务器后就等待子线程的处理结果,

image-20231220111950335

​ 在子线程一直等待服务器发送数据,当接收到数据后就处理,然后把处理结果交给主线程的流程,这样就不会出现卡死的状态了。至此,问题解决。

标签:主线,阻塞,C++,线程,服务器,recv,客户端
From: https://www.cnblogs.com/dwinternet/p/17916138.html

相关文章

  • DNS服务器搭建小记
    环境准备主机IPDNS服务器:Rocky_Linux9192.168.3.1/24web服务器:Rocky_Linux9192.168.3.2/24客户端:windows11192.168.3.10/24安装软件包#安装yuminstallbind-libsbind-utilsbind-chroot-y#卸载yumremovebind-libsbind-utilsbind-chroot-y修改配置文件#修改配置文件,使其......
  • C++ Qt开发:QItemDelegate 自定义代理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStyledItemDelegate自定义代理组件的常用方法及灵活运用。在Qt中,QStyledItemDelegate类是用于......
  • 将本地服务共享给服务器
    文档说明:只记录关键地方;发布时间:2023-12-20要求:通过公网临时访问正在开发的服务运行环境:linuxmacos用途例子:1、本地调试微信公众号服务器推送的消息2、公网临时预览,预览本地开发的服务3、服务器访问本地NAS服务4、远程协助等等说明将本地服务共享给服务器......
  • C++11 多线程
    文章参考:C++教程|爱编程的大丙(subingwen.cn)C++11的原子量与内存序浅析-兔晓侠-博客园(cnblogs.com)从C++11起,C++为用户提供一套新的多线程类。线程相关操作头文件:thread#include<thread>一.std::thread1.初始化和析构默认构造函数:原型:thread()noexce......
  • vscode插件,将修改的文件同步到服务器
    安装扩展--deploy 在setting.json中进行设置 "deploy":{"targets":[{"type":"sftp","name":"MySFTPfolder","descr......
  • 分享一个linux服务器迁移文件脚本
    #!/bin/bash#定义源和目标服务器SRC_SERVER=""DEST_SERVER="[email protected]"#定义源和目标目录SRC_DIR="/home"DEST_DIR="/home"#定义rsync命令选项1500是1500kbRSYNC_OPTS="-avz--partial--progress--delete--bwlimit=1500"#......
  • 改变上传的svg颜色并生成新的svg文件,再上传或者更新至服务器上
    最近有个需求,就是把上传的svg改颜色,并生成新的svg图片上传值服务器上<!DOCTYPEhtml><html><head><title>上传svg并修改颜色得到新的svg文件</title><style>#svgContainer{padding:50px;display:inline-block;}......
  • 恒创科技:云服务器1核2G和2核4G差距大吗?
    ​云服务器是运行在云计算平台上的虚拟服务器,当您创建云服务器时,云提供商会为您分配一定数量的虚拟化硬件,例如CPU、内存等,而在这些分配的配置中,1核2G和2核4G通常算是主流的选择,那么,这些配置参数到底是什么意思呢?它们之间差距大吗?本文主要从处理器核心数量、内存容量、建站选......
  • 物联网架构实例—解决Linux(Ubuntu)服务器最大TCP连接数限制
    1.前言:在对物联网网关进行压测的时候,发现在腾讯云部署网关程序,设备接入数量只能达到4000多个长连接,之后就再也无法接入终端了。之前在阿里云部署的时候明明可以到达2万左右,而且腾讯云的这个服务器比阿里云的硬件配置还要高上不少,不至于那么差,随后查阅大量资料终于完美解决。2.解......
  • ​物理服务器
    物理服务器物理服务器是一种独立的、非虚拟化的计算机设备,它通常被用作高性能应用、数据库、存储和网络等关键业务应用的运行平台。物理服务器可以提供更高的处理能力、更好的安全性和可靠性,但需要用户自行维护和管理。物理服务器的形式多种多样,常见的有塔式服务器、机架服务器和......