- 博客(52)
- 收藏
- 关注
原创 windows线程终止
理解Windows线程终止机制对于开发稳定的多线程应用至关重要。优先让线程自然退出,确保资源正确释放避免使用TerminateThread,除非绝对必要实现优雅退出机制,使用事件或标志通知线程退出始终检查线程状态,确保预期生命周期考虑使用线程池,减少创建/销毁开销。
2025-08-09 01:05:44
450
原创 为什么通过CreateThread创建的线程调用C/C++运行库函数不稳定
在Windows编程中,直接使用创建线程并在其中调用C/C++运行时库函数确实可能导致不稳定行为,这主要与运行时库的内部实现机制有关。
2025-08-09 00:11:29
727
原创 windows线程基础
Windows线程机制提供了强大的并发编程能力,但也带来了复杂性。理解线程的基本原理、掌握同步机制、合理使用线程池是编写高效、稳定多线程程序的关键。在实际开发中,应特别注意资源同步和线程安全,避免竞态条件和死锁等问题。
2025-08-08 17:50:40
1169
原创 TCP紧急消息
TCP紧急消息提供了一种内建的优先级传输机制,但在实际应用中存在诸多限制。理解其工作原理有助于在适当场景下合理使用,但在现代网络编程中,更多是通过应用层协议来实现类似功能。紧急消息本质上是TCP协议的一种带外数据标记机制大多数实现只支持1字节紧急数据接收处理需要考虑与普通数据流的关系现代应用通常使用专用控制通道替代紧急消息正确使用TCP紧急消息可以为特定应用场景增加灵活性,但不应该依赖它来实现关键业务逻辑。
2025-08-01 01:53:52
733
原创 IO复用实现并发服务器
资源高效:单进程管理多连接编程可控:明确的事件通知机制适用场景连接数适中(数百级别)需要跨平台支持开发周期短的原型项目理解select的工作原理是掌握高性能网络编程的基础,即使在现代epoll/kqueue广泛应用的今天,select仍然是许多场景下的可靠选择。
2025-07-30 19:02:07
970
原创 c语言获取文件大小
文件大小是文件处理中的一个基本信息,在C语言中有多种方法可以获取文件的大小。本文将详细介绍这些方法,并分析它们的优缺点和适用场景。
2025-07-30 02:03:55
736
原创 调用select之前复制fd_set
在编写使用select的程序时,经常会看到这样的模式:先将主fd_set复制到一个临时变量,然后将临时变量传递给select。这种做法看似多余,但实际上有非常重要的原因。
2025-07-28 00:20:58
730
原创 waitpid函数
waitpid精确控制:通过pid参数实现定向回收状态完备:完整处理所有可能的终止状态资源高效:合理选择阻塞/非阻塞模式异常安全:严格检查所有错误返回线程安全:多线程环境需特殊处理信号。
2025-07-22 17:46:38
711
原创 多进程服务器
当一个进程完成任务后没有被正确销毁,它就成了僵尸进程。就像完成工作的工人没有被妥善安置,仍在系统中占据着进程表项。正确管理进程生命周期:及时处理僵尸进程合理使用信号机制:避免阻塞,提高响应性谨慎管理资源:特别是套接字描述符考虑I/O分离:提升通信效率通过理解这些核心概念,开发者可以构建出高效、稳定的并发服务器,能够同时服务大量客户端请求,同时保持系统的健壮性和可靠性。
2025-07-19 17:44:18
889
原创 多级反馈队列
如果A的优先级 > B的优先级,运行A(不运行B)如果A的优先级 = B的优先级,轮转运行A和B工作进入系统时,放在最高优先级(最上层队列)一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次CPU),就降低其优先级(移入低一级队列)。经过一段时间S,就将系统中所有工作重新加入最高优先级队列。许多系统使用某种类型的 MLFQ。
2025-07-18 20:19:01
657
原创 Windows注册表编程
通过Windows注册表实现程序自启动是Windows开发中的常见需求。注册表的基本结构和关键概念注册表操作的核心API函数实现程序自启动的完整代码示例相关的高级主题和最佳实践正确使用注册表可以增强程序的灵活性,但需要注意操作的安全性。建议仅在必要时修改注册表,并确保做好错误处理和用户提示。对于大多数应用程序,使用当前用户的Run键是最简单安全的自启动方式。如果需要更复杂的启动逻辑,可以考虑使用任务计划程序等替代方案。
2025-07-15 00:33:46
576
原创 关于僵尸进程
在Unix/Linux系统中,**僵尸进程(Zombie Process)**是指那些已经终止执行但仍在进程表中保留着退出状态的子进程。这些进程实际上已经"死亡",但其进程描述符仍然存在于系统中,因此被称为"僵尸"——既不是完全活着的进程,也不是完全消失的进程。已完成执行(通过exit()系统调用或接收致命信号)仍在进程表中占有条目等待父进程读取其退出状态# 找到僵尸进程的父进程ID# 安全地终止父进程kill -HUP <parent_pid> # 先尝试优雅终止。
2025-07-14 23:55:31
328
原创 TCP半关闭
一根水管负责A→B的数据流动(输出流)另一根负责B→A的数据流动(输入流)这两根水管共同组成了一个完整的套接字连接更优雅的结束方式:明确传达结束意图更高效的资源利用:避免不必要的等待更灵活的协议设计:支持复杂交互模式掌握半关闭技术,能让你的网络程序像优秀的电话沟通一样:知道何时该说,何时该听,何时可以礼貌地结束对话。这种精准控制正是高级网络编程的重要技能之一。更优雅的结束方式:明确传达结束意图更高效的资源利用:避免不必要的等待更灵活的协议设计:支持复杂交互模式。
2025-07-14 20:24:16
431
原创 更优的TCP客户端设计
在之前的文章中提到过,TCP套接字没有数据边界的。在回声客户端中,只调用了一次read函数读取信息,读取到的信息可能存在问题,分别是数据截断和数据沾包。
2025-07-14 00:51:16
1210
原创 TCP类型的服务器和客户端
现代网络通信建立在TCP/IP协议栈基础上,这个协议栈采用分层设计,每层都有明确的职责(从下到上):链路层(物理层)负责物理连接的标准定义LAN(局域网)WAN(广域网)MAN(城域网)处理硬件寻址(如MAC地址)IP层(网络层)解决数据包在网络中的路由选择问题面向消息(无连接)不可靠(不保证送达)路径可能不一致(不同数据包可能走不同路径)传输层(TCP/UDP层)TCP面向连接可靠传输(通过确认和重传机制)保证数据顺序UDP无连接不可靠但高效不保证顺序。
2025-07-11 01:35:15
647
原创 创建套接字时和填充地址时指定类型的异同
明确性:确保套接字和地址结构的协议类型一致安全性:防止因类型不匹配导致的内存错误扩展性:支持多种协议共存的环境兼容性:为通用接口提供必要的类型信息理解这一设计有助于开发者编写更健壮的网络程序,避免潜在的协议相关错误。记住:在网络编程中,显式声明总是优于隐式假设。
2025-06-28 23:55:03
624
原创 地址簇与数据序列
理解IP地址和端口号的概念是网络编程的基础。通过合理使用结构体和相关转换函数,我们可以轻松处理网络地址信息。始终注意字节序转换服务器程序通常使用INADDR_ANY简化多网卡配置bind函数是建立套接字与地址关联的关键步骤。
2025-06-27 21:02:38
933
原创 套接字类型
在计算机网络中,协议(Protocol)就像人类交流的语言规则。它定义了通信双方如何建立连接、如何交换信息以及如何处理错误等基本规则。没有统一的协议,计算机之间的通信就会像两个说不同语言的人对话一样困难。理解套接字的协议分类和传输特性是网络编程的基础。通过合理选择协议簇和套接字类型,我们可以为应用程序构建最适合的网络通信方式。记住,没有绝对的好坏,只有适合与否的选择。
2025-06-27 20:09:21
654
原创 c++虚继承复习
/ 鸭嘴兽既是哺乳动物又是鸟类这种情况下,Platypus对象将包含两个Animal子对象(分别来自Mammal和Bird存储空间浪费访问age成员时的二义性逻辑上不合理(鸭嘴兽应该只有一个年龄)消除数据冗余解决成员访问二义性建立更合理的类层次结构但也需要注意其带来的复杂性和性能影响。在实际开发中,应当谨慎评估是否真的需要多重继承和虚继承,有时候组合模式可能是更好的选择。
2025-06-25 21:52:30
423
原创 c++lambda表达式
Lambda表达式是C++11引入的一项重要特性,它允许在代码中内联定义匿名函数对象,极大地提高了代码的简洁性和表现力。
2025-06-25 15:37:23
632
原创 操作符重载
这节给出几种操作符重载的示例,帮助大家更好地理解操作符重载。特性前置自增(++obj后置自增(obj++返回类型引用(值返回对象当前对象自身临时副本允许连续操作是否效率高(无拷贝)较低(创建副本)语义先递增再使用使用原值再递增++time;另外,后置自增运算符的参数是为了让其与前置自增运算符区分开来。特性输出运算符(<<输入运算符(>>参数1ostream&istream&参数2MyClass&返回值ostream&istream&常见实现输出成员到流从流读取到成员错误处理。
2025-06-25 15:28:48
948
原创 c++虚函数表
虚函数表是C++实现运行时多态(动态绑定)的核心机制,下面我将全面介绍虚函数表的工作原理和实现细节。本文由博主的复习笔记整理而成,希望对大家有所帮助。
2025-06-24 15:53:52
730
原创 基本进程调度算法
到目前为止,我们所讨论的所有调度算法都基于一个基本假设:每个任务的运行时间是可以预测的,实际上,这是无法做到的。在下一篇文章中,我们将不使用这个假设,再给出一些调度策略。
2025-06-24 00:11:17
747
原创 文件输入输出
头文件:fstream。ifstream,读ofstream,写fstream,读写在学习文件输入输出时,应该和之前学过的IO类关联起来。
2025-06-24 00:01:18
1094
原创 c++IO类
c++不直接处理输入输出,而是通过定义在标准类库中的类来处理IO。这些类支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件、控制台窗口等。还可以从内存IO。
2025-06-23 23:09:53
725
原创 图的基本介绍
边(Edge)**组成的非线性数据结构,用于表示实体及其关系。本文给出了图的基本性质,由笔者的复习笔记整理而来。图是一种由**顶点(Vertex)
2025-06-23 01:05:47
457
原创 c++对象移动
上一篇博文我们讲了对象的构造与析构,这篇博文我们讲一下对象的移动。有时候我们希望移动对象而不是拷贝对象,这时就需要用到对象的移动。比如unique_ptr只能移动而不能复制。
2025-06-21 17:00:37
799
原创 c++中的构造与析构
一般来说,构造函数需要为类中的每一个成员都赋值。**当类中定义了const类型的成员的时候,自定义构造函数必须对const类型的成员进行初始化,否则会报错。//这里对c的初始化时必须的如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值,这个构造函数就是拷贝构造函数。public://拷贝构造函数private:int a, b;将一个对象作为实参传递给非引用类型的形参。
2025-06-20 21:26:11
994
原创 Windows GDI的基本概念
本文只给出了GDI编程中基本绘图的示例,希望读者在了解了Windows GDI的基本概念(尤其是设备上下文)之后,能够自行查阅Windows官方文档并写出其它功能的示例程序。后面我也会写文章介绍GDI的其它应用。此外,MFC对Windows GDI进行了封装,之后会出一篇专门的文章说明MFC中的GDI编程。
2025-06-19 22:55:46
626
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人