udp/tcp错误总结

udp
tcp——多进程
tcp——多线程
tcp——线程池
tcp——守护进程

🎆udp
 ✨pthread_create 错误总结
 ✨LockGuard错误总结
 ✨服务端需要写成多线程
 ✨客户端也需要写成多线程
 ✨多线程调试工具
🎆tcp
 ✨tcp独有调试工具——telnet
 ✨ThreadPool —— 短连接
 ✨pthread_create —— 长连接
 ✨fork——长连接
 ✨进程池版的守护进程

在这里插入图片描述

🎆udp

✨1. pthread_create 错误总结

    static void* Routine(void* argv){// 线程本身就是运行起来一次就要结束,结束的动作由外部执行Thread* th = static_cast<Thread*>(argv);th->_fun(th->_info);// 线程自动调用这个函数,并将参数传递过去return nullptr;}bool Start(){cout << _name ;puts(" 线程将要运行");int n = pthread_create(&_tid,nullptr,Routine,this);cout << _name;puts(" 线程已经运行");if(n)return false;return true;}

pthread_create 不能使用 bind 进行绑定,只能使用static 函数进行创建

✨2. LockGuard错误总结

class LockGuard
{
public:// 锁必须传指针,不能传值/引用// 传值/引用会造成死锁现象LockGuard(const std::string& func_name, pthread_mutex_t* mtx):_func_name(func_name),_mutex(mtx){// puts("上锁");std::cout << "LockGuard:" <<  _func_name << "上锁" << std::endl;pthread_mutex_lock(_mutex);// 死锁位置// puts("上锁完成");std::cout << "LockGuard:" <<  _func_name << "上锁完成" << std::endl;}~LockGuard(){// puts("开始解锁");std::cout << "LockGuard:" << _func_name << "解锁" << std::endl;pthread_mutex_unlock(_mutex);// puts("解锁完成");}
private:// pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;// 这个锁不能初始化,这个锁用的是外面的锁pthread_mutex_t* _mutex;std::string _func_name;
};

​ 必须使用传指针的方式,如果使用传引用/传值的方式,就会出现死锁

✨3. 服务端需要写成多线程

如果写成单线程,可能会出现服务端只为一个服务,另一个发送消息显示不出来的情况;当此连接释放才能将内容显示出来

✨4. 客户端也需要写成多线程

需要一个send线程,一个recv线程
如果只有一个线程,线程如果阻塞在send线程,也就是需要从标准输入中读取才能进行发送,那么就无法进行recv;由于udp有自己的缓冲区,所以即使无法运行recv也是可以将少量消息进行记录

✨5. 多线程调试工具

pstack —— 查看多进程函数栈
gdb attach 线程id
info threads——查看线程信息
t 线程编号——切换线程
info b——查看线程信息

详细请参考 多进程调试工具

🎆tcp

✨tcp独有调试工具——telnet

没有写客户端的情况下还想进行调试,可以使用telnet进行调试,telnet只能对tcp进行使用

ThreadPool —— 短连接

  1. 什么是短连接
    长连接:将一个接收和发送作为一个任务,一个线程一直做这一个工作,知道客户端关闭,线程结束
    短连接:将一个接收和发送作为一个任务,一个套接字执行一个任务之后立即释放

  2. 理解为什么TheadPool 模型必须使用短连接
    线程池中线程个数有限如果使用长连接,服务端只能接收有限的用户,很显然是不合理的

  3. 使用function包装函数类型不同头文件中可能出现函数类型重名的问题
    在这里插入图片描述

  4. 灵活规定ThreadPool的任务类型
    在这里插入图片描述
    问题一为什么ThreadPool的类型是Task,为什么不能是一个套接字或者别的
    首先我们要明确线程要执行的任务是:使用套接字进行接收+发送消息
    问题二accept 函数是在主线程or子线程
    肯定是在主线程中,如果在子线程中还需要考虑访问套接字冲突的问题
    所以传递套接字应该是传递的接收消息的套接字
    问题三:为什么要将执行函数封装进去,可不可以在Task类中进行执行
    在Task类中实现执行函数完全是OK的,最关键的一点是要在Task类中重载(),这样在使用的时候就可以像执行函数一样执行了
    在这里插入图片描述

注意:在子线程中,执行完一个任务需要将这个任务的接收消息的套接字关闭,防止资源消耗完
在这里插入图片描述

pthread_create —— 长连接

  1. 一定要明确变量是要被外部使用还是只在本作用域中使用
    在这里插入图片描述
    如果局部变量需要传给外部进行使用,并且接收的参数是指针,当外部进行使用的时候,当前空间已经被回收,就无法拿到原来的数据
    解决方法:
    方法一:将接收参数改为传值接收
    方法二传递堆空间
  2. 创建子线程需要进行分离每个子线程使用的是不同的描述套接字,所以不存在访问冲突的问题,不需要加锁
    在这里插入图片描述

fork——长连接

  1. 因为进程有很强的独立性,所以可以将接收数据的套接字写成成员变量;父子进程间会发生写实拷贝,所有每个进程都会独立的维护自己的接收数据的套接字,完全不用担心在接收到一个全新的的连接之后会将上一个接收数据的套接字进行覆盖的情况
    在这里插入图片描述
  2. 满满的细节
    细节一子进程需要关闭父进程中的接收连接的套接字文件描述符——防止文件描述符的消耗
    细节二:为了不让父进程等待子进程退出,使用孙子进程的方式解决;子进程会立即结束,父进程也会立即回收子进程并等待下次连接
    细节三孙子进程连接结束一定要关闭文件描述符;首先关闭文件描述符是一个好习惯,其次文件描述符是使用引用计数的方式实现的,子进程退出,系统会自动回收子进程的资源,包括文件描述符,虽然在代码中没有什么危险,但是还是要关注这个细节
    细节四:虽然孙子进程会自动被系统回收,但是孙子进程也是需要手动退出,如果孙子进程没有主动退出,那么它将和父进程一样等待下次的连接
    在这里插入图片描述

✨进程池版的守护进程

  1. 手写守护进程
    SIGCLD, SIGPIPE, SIGSTOP 忽略——这三个信号在发出后,系统需要进行处理,需要从用户态转变为内核态,这个过程是很消耗资源,为了防止这种消耗,就将这三个信号进行忽略,并且这中操作在守护进程中是很常见的
    使用setsid来创建守护进程
    并将标准输入,标准输出,标准错误重定向到/dev/null文件中,/dev/null这个文件的内容会被自动丢掉,就像垃圾桶一样
    在这里插入图片描述
  2. 如果线程池先创建出来,再创建守护进程,那么守护进程不会将父进程中的线程继承下来,就导致了守护进程中虽然能将任务push进线程池,但是线程池中根本没有线程能够完成任务
    在这里插入图片描述
    所以根据他使用的时候创建的特点我们想到可以使用懒汉模式——完美解决守护进程无法继承父进程的线程的问题
    在这里插入图片描述还要注意懒汉模式是有线程安全问题,需要双层保障

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于瞬时频率的语言信号清/浊音判决和高音检测(MATLAB R2021)

语音是由气流激励声道从嘴唇或鼻孔辐射出来而产生的。根据声带是否振动&#xff0c;发音可分为浊音和清音。浊音和清音有明显的区别&#xff0c;浊音具有周期信号的特征&#xff0c;而清音则具有随机噪声的特征&#xff1b;浊音在频域上具有共振峰结构&#xff0c;其能量主要集…

⑤【Shiro】SpringBoot整合Shiro,实现登录认证

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ⑤【Shiro】SpringBoot整合Shiro&#xff0c;实…

AI助力科研创新与效率双提升:ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

计算机网络4——网络层2

文章目录 一、地址解析协议ARP二、IP数据报格式1、IP 数据报首部的固定部分中的各字段2、IP 数据报首部的可变部分 三、IP 层转发分组的过程1、流程2、案例分析3、最长前缀匹配4、分组转发算法5、使用二叉线索查找转发表 一、地址解析协议ARP 在实际应用中&#xff0c;我们经常…

第一篇【传奇开心果系列】Python深度学习库技术点案例示例:深度解读深度学习在自动驾驶领域的应用

传奇开心果博文系列 系列博文目录Python深度学习库技术点案例示例系列 博文目录前言一、深度学习在自动驾驶方面的应用介绍二、目标检测和识别示例代码三、路况感知示例代码四、行为预测示例代码五、路径规划示例代码六、自动驾驶控制示例代码七、感知融合示例代码八、高精度地…

【数据结构】串(String)

文章目录 基本概念顺序存储结构比较当前串与串s的大小取子串插入删除其他构造函数拷贝构造函数扩大数组空间。重载重载重载重载[]重载>>重载<< 链式存储结构链式存储结构链块存储结构 模式匹配朴素的模式匹配算法(BF算法)KMP算法字符串的前缀、后缀和部分匹配值nex…

Android 10.0 Launcher3替换桌面app图标后大小和其他app图标不一样的问题解决方案

1.前言 在10.0的系统ROM产品定制化开发中,在关于launcher3的产品定制化开发中,在有些时候需要对一些第三方的app图标做 替换或者是做一些动态图标的替换,发现在替换以后图标大小和其他app的图标大小不一样,所以就需要看是具体哪里 对app的图标做了缩放功能,接下来就需要去…

【网页在线小游戏源码】

网页在线小游戏源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.html <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta id"viewport" na…

WEB逆向—X-Bogus逆向分析(纯算+补环境)

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 前言 此平台 本人 仅限…

分类预测 | Matlab实现CNN-BiLSTM-SAM-Attention卷积双向长短期记忆神经网络融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-BiLSTM-SAM-Attention卷积双向长短期记忆神经网络融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-BiLSTM-SAM-Attention卷积双向长短期记忆神经网络融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基…

深入探究音视频开源库WebRTC中NetEQ音频抗网络延时与抗丢包的实现机制

目录 1、引言 2、WebRTC简介 3、什么是NetEQ&#xff1f; 4、NetEQ技术详解 4.1、NetEQ概述 4.2、抖动消除技术 4.3、丢包补偿技术 4.4、NetEQ概要设计 4.5、NetEQ的命令机制 4.6、NetEQ的播放机制 4.7、MCU的控制机制 4.8、DSP的算法处理 4.9、DSP算法的模拟测试…

分布式与一致性协议之CAP(二)

CAP CAP不可能三角 CAP不可能三角是指对于一个分布式系统而言&#xff0c;一致性、可用性、分区容错性指标不可兼得&#xff0c;只能从中选择两个&#xff0c; 如图所示。CAP不可能三角最初是埃里克布鲁尔(Eric Brewer)基于自己的工程实践提出的一个猜想&#xff0c;后被塞斯吉…

论文辅助笔记:LLM-MOB代码解读

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor-CSDN博客 1 主函数 1.1 导入库 import os import pickle import time import ast import logging from datetime import datetime import pandas as pd from openai import OpenAIclie…

【003_音频开发_基础篇_Linux进程通信(20种你了解几种?)】

003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;) 文章目录 003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;)创作背景Linux 进程通信类型fork() 函数fork() 输出 2 次fork() 输出 8 次fork() 返回值fork() 创建子进程 方…

Diffusion Model原理剖析

目录 前言1. DDPM演算法初览2. 图像生成模型共同目标3. VAE: Lower bound of l o g P ( x ) logP(x) logP(x)4. Diffusion Model背后的数学原理5. 为什么需要Sample?6. Diffusion Model的应用7. Diffusion Model成功的关键总结参考 前言 接着上篇文章 图像生成模型浅析&#…

Three.js入门学习笔记

学习资料&#xff1a; 【Three.js】Three.js快速上手教程_three.module.js-CSDN博客 2024年了&#xff0c;是该学学Three.js了_three.js 2024-CSDN博客 一、three.js简介 three.js是JavaScript编写的WebGL第三方库。 three.js&#xff0c;webGL&#xff0c;openGL三者的关…

【Linux高性能服务器编程】两种高性能并发模式剖析——领导者/追随者模式

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之两种高性能并发模式介绍&#xff0c;在这篇文章中&#xff0c;你将会学习到高效的创建自己的高性能服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解…

SpringBoot自动配置底层源码分析

文章目录 1. 什么是SpringBoot的自动装配&#xff1f;2. SpringBoot自动装配的底层原理 1. 什么是SpringBoot的自动装配&#xff1f; Spring Boot的自动配置是一种机制&#xff0c;它使得开发者能够快速地开始构建Spring应用&#xff0c;而不需要手动编写大量的样板代码。Spri…

FRPC+PHP+MYSQL+APACHE2=个人网站

应用背景有公网需求,但是又不想去买又贵又低配置的服务器,然后方案就应运而生 frp/README_zh.md at dev fatedier/frp (github.com) 在这里, FRPC作为内网穿透服务, PHPMYSQLAPACHE2,作为网站搭建,具体细节不细讲, 但是在我的/var/www/html下面 linaroHinlink:/var/www/h…

CSS3新增特性(二)

四、2D 转换 • 属性名&#xff1a;transform &#xff08;可用于制作2D转换&#xff0c;也可用于制作3D转转换&#xff1b;2D转换是平面上的转换&#xff0c;3D转换是在三维立体空间的转换&#xff09; • 作用&#xff1a;对元素进行水平或垂直方向的移动、缩放、旋转、拉长…