浅谈环形队列数据结构
环形队列(Circular Queue),也被称为环形缓冲区(Circular Buffer)或环状缓冲区(Ring Buffer)。这是一个在高性能计算、底层驱动和实时系统中极为重要和常见的数据结构。环形队列有很多应用,比如音视频处理中的平滑地处理数据流,防止卡顿;操作系统内核中的I/O缓冲区、管道(Pipe)的实现;网络通信中用于收发网络数据包的缓冲区;以及使用内存映射文件进行进程间通讯时,使用环形缓冲区能够减少锁占用。 …
环形队列(Circular Queue),也被称为环形缓冲区(Circular Buffer)或环状缓冲区(Ring Buffer)。这是一个在高性能计算、底层驱动和实时系统中极为重要和常见的数据结构。环形队列有很多应用,比如音视频处理中的平滑地处理数据流,防止卡顿;操作系统内核中的I/O缓冲区、管道(Pipe)的实现;网络通信中用于收发网络数据包的缓冲区;以及使用内存映射文件进行进程间通讯时,使用环形缓冲区能够减少锁占用。 …
本文深入剖析了C++语言演化中所秉持的“审慎原则”,论证了标准委员会(WG21)通过有意识地拒绝或搁置某些语言特性,从而成功维护了C++的长期稳定性与核心设计哲学。报告通过四个关键案例展开论证:一、在处理多重继承的虚函数名冲突时,委员会选择推广设计模式(适配器模式)而非引入新“重命名”语法,以避免语言膨胀。二、面对双重分发的需求,它采纳了访问者模式,拒绝了可能导致对象模型过度复杂化的原生语言支持。三、它坚定地拒绝内置垃圾回收(GC)机制,以捍G卫RAII范式、零开销原则及性能的确定性,这些是C++的立身之本。四、在类型推导上,它没有直接采纳当时已有但存在瑕疵的typeof,而是精心设计了语义更精确的decltype,彰显了对语言基础工具正确性的极致追求。综上所述,这些决策共同揭示了C++标准化过程中的一种成熟智慧:通过审慎的“减法”来保证语言的健壮、高效与持久生命力 …
CMake已经成为C++生态系统中事实上的标准构建系统生成器。它通过将复杂的构建逻辑抽象到一个统一的、跨平台的脚本语言中,极大地提高了项目的可维护性和可移植性。掌握现代CMake,特别是其基于目标的依赖管理思想,是每一位严肃的C++开发者必备的技能。本教程从CMake的基础工作流程和核心语法出发,深入探讨了作用域、库的构建与链接、条件编译以及高级模块化技术。我们强调了“源码外构建”的重要性,详细解析了PUBLIC、PRIVATE和INTERFACE关键字在传递依赖关系中的核心作用,并针对Linux平台特别讲解了RPATH和$ORIGIN在创建可重定位软件包中的应用。通过对比function与macro、target_sources与file(GLOB),我们阐明了现代CMake的最佳实践及其背后的设计哲学。最终,通过一个完整的实战项目,我们将所有理论知识融会贯通,展示了如何构建一个结构清晰 …
本文通过一个时间同步服务的具体案例,深入探讨了Windows服务在“快速启动”模式下出现的“伪运行”问题。该问题的典型症状是:服务设置为自动启动,在“关机”再开机后,其状态显示为“正在运行”,却没有执行其OnStart方法中的关键启动任务(如首次时间同步)。文章剖析了此现象的根本原因在于Windows的快速启动机制。该机制通过休眠并恢复系统内核及服务进程来加速开机,这个过程会完全跳过OnStart方法,导致服务从一个过时的、无效的内存状态中“假醒”,成为“僵尸服务”。为解决此问题,文章提供了一套完整的排查与解决方案。首先,介绍了如何通过正确配置Windows事件日志来进行有效诊断,并指出了创建事件源的权限要点。其次,说明了如何通过禁用快速启动来快速验证问题根源。最终,文章给出了最健壮的根本性解决方案:在C#服务代码中重写OnPowerEvent方法,使其能够响应系统的Suspend …
即便是给一个对象的属性赋上与它当前完全相同的值,相关的“已更改”(XXXChanged)事件依然被触发了。一个典型的例子就是在使用 System.Data.DataTable 或System.Configuration.ApplicationSettingsBase时。研究源码发现,ApplicationSettingsBase 和 DataTable 的“赋值即触发”行为,并非缺陷,而是.NET框架中一个优雅且实用的状态驱动事件模式的体现。它将数据容器从简单的值存储器提升为强大的状态机,极大地简化了数据持久化和同步的复杂性。它选择牺牲微不足道的判断性能,来换取核心功能(状态跟踪)的绝对可靠性。理解了其“关注状态,而非价值”的核心思想,并洞悉其源码实现后,我们就能根据实际场景,明智地选择是利用还是“修正”这一行为,从而编写出更健壮、更高效的.NET应用程序。 …
在之前写了两篇关于NTP的文章,一篇是使用NTP协议实现本地时间跟NTP授时服务器进行同步介绍了NTP协议的原理,另一篇是实现一个时间同步客户端NTPClock介绍了使用WPF编写一个模仿NTPClock的时间同步的App,因为Windows的自动较时功能不是很完善,所以这个应用我自己使用了很长时间。 在这篇文章里,我准备将前面两篇文章总结一下,对一些方法进行重构,另外实现一个利用NTP来实现授时的服务端,以完善整个功能。一般的我们都是使用一些公开的NTP授时服务地址,比如"time.windows.com"、"pool.ntp.org"等来获取时间,这有一些限制: 必须要求这个服务器能够访问和解析这些授时服务器地址,这在有些机房的内网计算机上其实是无法满足条件的。 这些公开的NTP授时服务器大多有请求频率限制,如果请求次数多过或过快,可能会请求失败。 有时候,我们有自己的GPS接收装置 …
虽然C#转眼间已经发展到了10.0版本,但有些在 C#5.0 引入并随.NET Framework 4.5一同发布的特性比如async和await我仍不是很清楚,但这些新特性在一些人工智能生成的代码中使用的越来越多,因为它们确实能够提高异步编程时代码的清晰度,所以最近几天好好研究了一下它的原理。异步编程可以解决线程因为等待独占式任务而导致的阻塞,但异步编程一直是一个难点,如何正确实现异步模式却不容易,因为它涉及到诸如状态管理,异常管理,同步上下文,异步任务组合等等诸多问题。C#中有很多异步编程模型,最早的有APM (Asynchronous Programming Model) ,随后有EAP(Event-Based Asynchronous Pattern)以及建立在EAP基础上的BackgroundWorker等等,这些异步编程模型在场景比较简单时可能可以满足要求,但 …
在大概一年多以前,我写了一个简单的通过程序判断和阻止来自特定IP地址的远程桌面连接攻击的程序,一直以来是作为一个简单的控制台程序来使用的,用起来效果很不错。最近我在自己的阿里云服务器上也发现了很多这种远程桌面登录连接的尝试,但这也没有办法,只要端口对外网暴露,就免不了会有这种攻击。于是我对之前的那个小程序做了一些调整和完善,主要改进了: 程序不一定要监控特定端口,只要在日志里查找到了类型ID为4625的错误日志,就认为是远程桌面连接登录。 当远程桌面登录失败尝试超过3次后,除了添加到防火墙之外,还记录该远程信息到日志,包括远程IP尝试登录时采用的用户名,IP归属地等信息。 平台使用最新的.NET 8.0来重写,程序可以作为控制台程序,或Windows Service 安装运行。 添加白名单机制,对于白名单里面的IP地址不做登录失败校验。 …
最近大模型热火朝天,于是我也开始在工作中尝试使用这类工具来提高编码效率。工作中编码时,我主要使用的是豆包,它有专门的桌面客户端。本文介绍了如何申请Google Gemini Advance的15个月免费试用,内容包括如何使用稳定线路的美国网络,如何提供满足条件的Google账户,如果申请美国edu邮箱,如何申请符合条件的美国信用卡,在满足以上条件之后,如何免费申请Google Gemini Advance的15个月学生优惠免费试用。 …
JSON的序列化和反序列化在工作中偶尔会用到,特别是在处理网络请求的时候。通常的网站或者api接口会提供json数据格式,要将json字符串转换为C#中的对象,就要用到序列化和反序列化。恰好最近刚有一个需求,需要从某个网站上获取一下Shibor数据,这里涉及到了自定义的JSON序列化,简单记录一下。 …