- 博客(186)
- 资源 (2)
- 问答 (2)
- 收藏
- 关注
原创 Protocol Buffers(Protobuf)
Protocol Buffers(Protobuf)是Google开发的高效结构化数据序列化机制,具有体积小、解析快、强类型安全和多语言支持等优势。其高效压缩源于语义感知编码,如字段ID代替名称、变长整数编码等技术。本文以CentOS 8环境为例,详细介绍了Protobuf v21.12的离线安装方法,并通过C++示例展示了从.proto文件定义到程序开发的完整流程。最后提供了二进制数据调试技巧,包括十六进制打印和protoc解码工具的使用,帮助开发者快速定位反序列化问题。
2026-02-05 11:16:19
775
原创 ZMQ(四):可靠性设计与高级模式
本文探讨了ZeroMQ中REQ/REP套接字的可靠性问题,提出了四种渐进式解决方案。首先介绍了简单的超时机制实现,然后详细讲解了Lazy Pirate客户端重试模式,包括指数退避策略。接着展示了Simple Pirate架构,通过ROUTER/DEALER套接字实现无状态Worker和服务代理,构建具有容错能力的分布式系统。所有方案均提供C/C++实现代码,从基础到高级逐步提升系统可靠性,适用于不同场景的网络通信需求。
2026-01-29 11:47:29
1047
原创 ZMQ(三):核心机制——多帧消息、路由、背压、零拷贝...
ZeroMQ消息机制核心要点: 多帧消息保证原子性,通过ZMQ_SNDMORE标志发送,接收端用ZMQ_RCVMORE判断后续帧; 身份标识是ROUTER路由关键,需在连接前设置唯一ID,回复消息必须包含身份帧; 公平队列实现轮询负载均衡,但非严格保证; 高水位线(HWM)控制流量,超过限制时PUB丢弃消息而ROUTER可能阻塞; 不同套接字类型有严格语义(如REQ必须send-recv循环),PUB-SUB适合非关键通知; ZMQ_LINGER设置关闭等待时间,避免消息丢失; 消息边界自动维护,与TCP字
2026-01-27 11:51:28
772
原创 ZMQ(二):通信模式
ZeroMQ通信模式解析:REQ-REP与PUB-SUB对比 摘要: 本文详细分析了ZeroMQ的两种核心通信模式。REQ-REP(请求-应答)模式采用严格的同步轮次机制,强制遵循send→recv的交互顺序,适用于简单同步场景但存在串行化瓶颈。PUB-SUB(发布-订阅)模式实现单向消息广播,支持基于前缀的主题订阅,具有完全解耦的特性但缺乏可靠性保证。两种模式各具特点:REQ-REP适合低频可靠交互,而PUB-SUB适用于大规模数据分发场景。文中通过C++代码示例展示了具体实现,并重点指出了REQ-REP
2026-01-26 15:10:08
1056
原创 ZMQ(一):简介与安装
ZeroMQ(ZMQ)是一个高性能、轻量级的异步消息传递库,支持多种通信模式(如请求-响应、发布-订阅等)。它采用无中心架构,提供跨平台支持,包括TCP、IPC等多种传输协议。开发时可选libzmq(C底层库)、CZMQ(高级C绑定)或cppzmq(现代C++封装)。学习资源包括《ZeroMQ指南》和官方API文档。在CentOS 8上可通过EPEL仓库快速安装运行时和开发包,并支持离线查阅man手册验证安装。
2026-01-23 14:43:03
798
原创 Lambda避坑指南
本文系统介绍了C++中Lambda表达式的基础语法、主要应用场景及常见问题解决方案。重点讲解了捕获列表的多种形式,包括值捕获、引用捕获和C++17新增的[*this]捕获方式。通过STL算法、回调函数、并发编程等典型用例展示了Lambda的实际应用。针对悬空引用、隐式拷贝、mutable使用等常见陷阱提供了具体解决方案,并给出了显式捕获、生命周期管理、智能指针等最佳实践建议。文章强调在享受Lambda便利性的同时,需深入理解其闭包机制和捕获语义,才能避免潜在问题。
2026-01-22 10:32:21
1030
原创 C++完美转发
在现代C++中,完美转发(PerfectForwarding)是一个非常强大但又容易被误解的特性。它允许函数模板将其参数【原封不动】地转发给另一个函数,保留参数的值类别(左值或右值)、const 限定符、volatile限定符等所有属性。本文将带你深入理解完美转发的工作原理、使用方法以及常见陷阱。
2026-01-21 15:20:30
829
原创 自旋锁(Spinlock)
在多线程并发编程中,**自旋锁(Spinlock)** 是一种轻量级的同步原语。它虽简单,却在高性能系统中扮演着关键角色。本文将从原理、适用场景、实现要点和经典变种四个方面,深入剖析自旋锁。
2026-01-21 13:33:44
1048
原创 什么是 Wait-Free ?
本文介绍了并发编程中的Wait-Free(无等待)概念,这是最强的活性保证,确保每个线程都能在有限步骤内完成操作,不受其他线程影响。与Lock-Free(至少一个线程能进展)和Blocking(可能永久阻塞)相比,Wait-Free提供了最高级别的可靠性。文章通过计数器示例对比三种实现方式,并指出Wait-Free算法的设计核心是避免重试和确保操作一次性生效。C++标准不强制要求原子操作是Wait-Free,但简单类型在硬件支持下可视为Wait-Free。真正的Wait-Free算法复杂,主要用于高可靠系统
2026-01-13 13:36:56
639
原创 C++ 内存序(Memory Order)
在现代多核处理器和高并发程序设计中,C++ 提供了强大的原子操作(`std::atomic`)机制来实现线程安全。然而,仅仅使用原子类型并不足以完全掌控程序的执行语义——**内存序(Memory Order)** 才是决定原子操作如何与内存交互、如何被其他线程观察到的关键。本文将深入探讨 C++11 引入的六种内存序,解释它们的作用、适用场景以及背后的硬件原理,帮助你写出更高效、更正确的并发代码。
2026-01-12 15:25:19
505
原创 什么时候使用noexcept?
C++中noexcept的正确使用指南 noexcept是C++11引入的关键字,用于声明函数不会抛出异常。正确使用noexcept可以带来以下好处: 促进编译器优化,减少异常处理代码 影响标准库行为,如std::vector在移动元素时会优先使用标记为noexcept的移动操作 提高代码可预测性 适用场景: 析构函数(默认noexcept) 简单的移动构造/赋值操作 swap函数 简单的getter/const成员函数 自定义哈希/比较函数 使用原则: 只有在确定函数在任何情况下都不会抛出异常时才使用 可
2026-01-11 11:39:36
631
原创 ck_ring(环形队列)
ck_ring是Concurrency Kit中的高性能无锁环形缓冲区实现,具有无锁设计、缓存优化和多种并发模式支持等特点。其核心数据结构采用分离设计,控制结构与存储结构独立,支持灵活的数据存储方式。通过掩码运算处理索引溢出,确保环形缓冲区的正确性。SPSC模式下的单生产者入队操作展示了其高效性,利用原子操作和缓存行填充优化性能。适用于消息传递、生产者-消费者模型等高性能场景,是低延迟并发编程的理想选择。
2026-01-07 13:34:20
843
原创 对齐陷阱、自然对齐和强内存模型
摘要: 对齐陷阱指程序访问未按自然边界对齐的内存地址时触发的异常或性能损失,在严格对齐架构(如ARM)会崩溃,x86虽支持但性能下降且原子性无法保证。自然对齐要求数据类型地址是其大小的整数倍,对性能、原子性和可移植性至关重要。对齐规则由CPU架构、ABI和编译器共同决定,程序员可通过alignof查询并显式控制。x86_64采用强内存模型(TSO),限制指令重排序,但仍需同步机制避免数据竞争。开发时应避免未对齐访问,使用标准属性确保可移植性,并遵循内存模型规范编写线程安全代码。
2026-01-07 10:41:58
913
原创 nc(ncat)
Netcat (Netework Concatenate)被誉为网络界的瑞士军刀,它可以读写网络连接,支持 TCP、UDP 协议,并可用于端口扫描、文件传输、端口监听、重定向等多种用途。
2026-01-04 13:59:15
592
原创 Wake-on-LAN (WOL) 远程开机
文章摘要: Wake-on-LAN(WOL)是一种通过局域网发送魔术包远程唤醒关机/睡眠设备的技术。使用前需确保目标设备保持电源接通,且主板BIOS和网卡均支持WOL功能。在Linux系统中,可通过ethtool检查并启用网卡的WOL功能,临时命令为sudo ethtool -s eth0 wol g,永久生效需配置systemd服务。本文提供了一个Python脚本wol.py,可自动获取目标IP的MAC地址和广播地址,发送魔术包唤醒设备。使用时执行./wol.py 目标IP即可完成唤醒操作。
2025-12-31 17:49:18
1838
原创 iproute2——ip
ip 是 Linux 中用于管理网络配置的核心命令,属于 iproute2 工具集,可替代 ifconfig、route 等传统工具。它支持配置 IP 地址、管理网络接口、路由表、ARP 表、隧道及网络命名空间等,功能强大且高效,适用于系统运维与网络调试,但配置默认不持久化,需配合其他机制实现开机生效。
2025-12-31 17:11:52
1158
原创 SS (Socket Statistic)
ss是netstat的高效替代工具,通过直接访问内核TCP控制块获取网络连接信息,避免了netstat解析文本文件的开销。它支持丰富的选项和过滤器,可以快速查看TCP/UDP套接字状态、进程关联及内存使用情况。常用组合如-tuln显示监听端口,配合state过滤器可精确筛选连接状态。ss还提供高层状态组抽象(如connected、synchronized)简化查询,是Linux网络故障排查的利器。
2025-12-31 15:19:58
871
原创 构建一个高效且功能丰富的 C++ 日志库
摘要: 本文介绍了一个高效、功能丰富的C++日志库设计,支持流式输出和格式化字符串两种日志记录方式,提供控制台、文件、网络(需扩展)等多种输出目标。核心特性包括异步I/O、日志轮转(文件大小限制与自动清理)、控制台彩色日志分级显示。架构基于线程安全队列和抽象接口(ISink),通过Logger单例统一管理日志输出。使用简单,提供宏(如LOCAL_INFO、FILE_ERR)和流式API(类似std::cout)两种调用方式,适用于开发调试(控制台输出)和生产环境(文件持久化),并支持自定义扩展(如网络日志)
2025-07-02 11:53:03
982
原创 Intel RDT CAT
RDT,全称为Resource Director Technology,翻译为资源导向技术或资源分配技术。是英特尔提出的一系列硬件特性,用于增强对共享资源的监控和分配。因此,RDT特指英特尔的技术,并不是跨厂商的标准。该技术旨在通过一系列的CPU指令从而允许用户直接对每个CPU核心的L2缓存、L3缓存(Last Level Cache, LLC)以及内存带宽进行监控和分配。缓存检测技术允许软件查询特定的应用程序或虚拟机在共享最后一级缓存(LLC)中的占用情况。缓存分配技术。
2025-03-10 17:07:37
1375
原创 UDP多对多组播通信
广播和多播仅应用于UDP。TCP是一个面向连接的协议,TCP一定是点对点的,一点是两个主机来建立连接的,TCP肯定是单播。只有UDP才会使用广播和组播。如下示例实现一个UDP多对多的组播通信,进程中有收、发两个线程,分别表示往组播发送、接收数据。使用任意节点发送消息,其它的节点都能收到。
2024-05-15 14:48:28
635
1
原创 valgrind使用
Valgrind是一个工具集,包含了许多调试与性能分析的工具。其中使用最多的是Memcheck,它能帮你检测C/C++中的内存问题,避免程序崩溃或不可预知错误。Cachegrind一个缓存和分支预测分析器。它能够模拟CPU中的一级缓存L1、D1和二级缓存,且能够精确指出程序中cache的命中和丢失。它还可以给出每行代码,每个函数,每个模块,和整个程序的内存引用次数以及指令数,有利于优化程序。Callgrind相当于Cachegrind的一个扩展。
2024-01-24 16:19:31
1313
原创 红黑树的删除
好了,到这红黑树的删除总算讲完了,不知道你有没有睡着。重点是,红黑树的删除 = 删除 + 维护,无论怎样删除结点,都会动态的调整树高。
2023-12-29 17:02:50
1155
原创 红黑树的插入
当你熟悉了上面五种场景后,无论红黑树已经有多大,无论新节点从哪个位置插入,都能按合适的方式调整整个树的高度,就才是插入算法的精妙所在!
2023-12-26 10:40:46
1269
原创 红黑树的旋转、变色
旋转是以一个父节点作为参照物的。旋转分为左旋转与右旋转,其对应的结果就是将左子节点(后称左节点)或右子节点(后称右节点)替换原来的父节点,具体操作如下。右旋转使左节点成为新的父节点。原来的父节点,成为新的右节点。先前左节点的右子树,变成新右节点的左子树。左旋转使右节点成为新的父节点。原来的父节点,成为新的左节点。先前右节点的左子树,变成新左节点的右子树。
2023-12-25 10:54:08
614
原创 哈希表、哈希冲突解决办法
我们知道,普通数组能够直接寻址,在O(1)时间内能访问到数组中的任意位置。它需要足够大的空间,为每一个关键字保留一个位置。当关键字取值的范围很大,储存空间又有限时,能不能同样用数组的形式实现O(1)查找?哈希表(Hash Table)就是这样的数据结构,当实际储存的关键字集合,比所有可能的关键字的全集小许多时,使用一个长度有限的数组去储存这些关键字,从而节省大量的空闲空间。它也被称作为散列表,因为它的键是分散存储在数组中的。如图,黄色区域为键的全集,范围为0~99,绿色区域为实际存储的键。
2023-11-27 13:09:31
1748
原创 多路复用IO:select、poll、epoll
多路IO复用是指单个进程/线程就可以同时处理多个IO请求。用户将想要监视的文件描述符添加到selectpollepoll函数中,由内核监视,函数阻塞。一旦有文件描述符就绪(读就绪或写就绪),或者超时(设置了超时时间),函数就会返回,然后该进程可以进行相应的读/写操作。
2023-11-13 10:53:56
463
原创 Linux 命令(11)—— tcpdump
tcpdump是一个网络抓包工具,它可以捕获和分析TCP/IP网络协议的数据包。它使用libpcap库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有。之所以叫做tcpdump,是因为它最初是用于捕获和分析TCP协议的数据包。然而,随着时间的推移,它的功能扩展到了其他协议,如UDPICMP等。尽管如此,它的名称仍然保持为tcpdump。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
2023-10-26 14:29:12
1664
原创 Linux 命令(10)—— ps
UNIX风格的选项:必须以开头,多个选项可以组合在一起使用。例如,ps -auxps -ef。BSD风格的选项:不能以开头,多个选项可以组合在一起使用。例如,ps auxps ef。GNU风格的长选项:必须以--ps --info。ps -aux与ps aux会产生不同的结果。
2023-08-03 10:00:25
412
原创 如何避免GCC优化选项对程序带来的干扰?
关于具体每个编译选项的解释,牵扯到太多的背景知识。可以通过man文档查找说明。的汇编代码,精简了许多操作,而这些细微的差异如果不注意,会违背开发者的初衷,甚至影响程序预期结果。也就是说,程序没有按原有的逻辑去执行循环累加,而直接返回了计算结果。发现main函数汇编代码的第二行,是将立即数0x1356(十进制:4950)移入。开启的编译选项,默认。
2023-08-02 15:54:11
586
原创 实际用户ID、有效用户ID、保存的设置用户ID
与进程相关的id简介查看方式如何设置实际用户ID (Real User ID, RUID)进程被创建时的用户ID一般不可更改实际组ID (Real Group ID, RGID)进程被创建时的组ID一般不可更改有效用户ID (Effective User ID, EUID)进程访问文件或其他资源时使用的用户ID有效组ID (Effective Group ID, EGID)进程访问文件或其他资源时使用的组ID。
2023-07-22 14:38:32
1610
原创 Google Test(gtest)新手入门
gtest),也称为Google C++ Testing Framework,是一个由Google开发的开源C++测试框架,提供了多种工具来支持C++代码的单元测试。提供了多种断言方法,可以用于测试函数、代码片段的预期行为。支持自动化测试,可以方便编写测试用例,并自动运行和输出结果。支持死亡测试(Death Test),测试代码在极端或异常条件下的行为表现。提供测试夹具(Test Fixture,一种用于编写可重复执行的测试用例的机制),使得测试用例便于重用。
2023-07-20 17:00:10
3548
原创 使用PAPI进行性能测试
PAPI(Performance Application Programming Interface)是一个跨平台的性能计数接口工具集。它提供了一套标准化的API,用于访问硬件性能监测计数器(PMU),在软件中实现高精度的性能分析与优化。PAPI性能测试工具的安装、使用及实例 - Satchmo丶 - 博客园 (cnblogs.com)
2023-06-28 13:59:24
1337
原创 Linux Perf
perf (Performance analysis tools for Linux),是Linux官方的性能分析器(profiling),存在于内核源码目录tools/perf中。可以用于分析系统调用、硬件事件、软件事件、CPU使用情况、内存使用情况、锁等信息,从而帮助定位系统性能问题。perf原名为Linux性能计数器(Performance Counters for Linux,PCL),现名为Linux性能事件(Linux Performance Events,LPE)。
2023-06-25 16:54:01
2269
原创 Linux 命令(9)—— top
top提供运行系统的动态实时视图。它可以显示系统摘要信息以及当前由Linux内核管理的任务列表。所显示的系统摘要信息的类型以及为任务显示的信息的类型、顺序和大小都是用户可配置的,并且可以在重新启动期间使配置持久。
2023-06-16 15:10:36
4402
原创 解释器模式(Interpreter)
定义一个语言的文法,并且建立一个解释器来解释该语言中的句子。解释器模式是一种类行为型模式。就比如正则表达式,它就是解释器模型的一种应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。
2022-12-27 11:20:03
678
原创 访问者模式(Visitor)
在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。访问者模式定义:表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。假如你需要将数据对象存储到xml文件中,而这样的数据类型有很多种。你不可能为每个类添加一个存储为xml的方法,因为后续可能又需要将数据存储其它格式,比如json,csv等。
2022-12-15 23:45:36
585
原创 模板方法模式(Template Method)
模板方法模式定义:是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。如在构建造房屋时,有一些基本的步骤,例如打地基、 建造框架、 建造墙壁和安装水电管线等。标准房屋建造方案中可提供几个扩展点,允许潜在房屋业主调整成品房屋的部分细节。使得成品房屋会略有不同。
2022-12-15 20:58:46
572
原创 策略模式(State)
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。策略模式定义:策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,让它们可以相互替换。假如你需要前往机场。你可以选择乘坐公共汽车、预约出租车或骑自行车。这些就是你的出行策略。你可以根据预算或时间等因素来选择其中一种策略。
2022-12-15 11:04:34
599
GDB调试程序-入门级
2019-02-26
求正则表达式:匹配不包含"E2564"、"E2462"的字符串
2020-12-14
vscode怎样包含boost库?
2022-04-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅