- 博客(3265)
- 收藏
- 关注
原创 【Physics】3. Bead on a Rotating Hoop — A Pitchfork Bifurcation、The Falling Chain
Let θθθ˙cgRωc0;for ωωc±arccosgω2Rωceffθ−mgRcosθ−21mω2R2sin2θeff′θ0eff′′θ0eff21mR2θ˙2R2ω2sin2θ−mgRcosθ. LT−V21mR2θ˙2R2ω2sin2θmgRcosθtd。
2026-03-22 14:17:51
339
原创 【Math】3. A Logarithmic Integral、A Nonlinear Recurrence that Produces Integers
EvaluateI∫0π/2lnsinxdx. Let I∫0π/2lnsinxdx→π/2−xgives I∫0π/2lncosxdxxcosx21sin2xIback to I→2π−xI∫02πlncosxdx2I∫02πlnsinxcosxdxI21∫02πln21sin2xd。
2026-03-19 23:35:40
328
原创 【Physics】2. Loop in a Decaying Field、Falling Chain onto a Scale
tB0e−tτt0to t∞t∫IdtR1∫EdtRΔΦ.(a) ΦtBtπr2πr2B0e−τt, It−R1dtdΦtτR1πr2B0e−τt(b) Q∫0∞ItdtR1Φ0−Φ∞))πr2B0© Q2gxpvdmt.Let λmLxgxdxλg。
2026-03-14 13:47:19
262
原创 【Physics】1. Two Blocks and a Pulley、Sliding Off a Sphere
13kgand m25kg2g−Tm2aT−m1gm1aso am1m2m2−m1g, for m12m1m22m1m2gcosθRv2gR1−cosθ21mv2, cosθ32, θarccos32。
2026-03-14 13:43:36
285
原创 【Math】1. Digit Sum Divisibility、Floor Sum
and n1, then nand n1. So n9’s, so na9..., aa9k∧7∣a1, so a6k41∑1000⌊3k⌋−3⌊9k⌋⌊7k⌋where ⌊x⌋k1N⌊km⌋abk⌋⌊b⌊ak⌋⌋Let kqabr0≤rab, then ⌊abk⌋q, ⌊ak⌋qb⌊ar⌋。
2026-03-14 13:41:55
353
原创 【Computer Science】1. Longest Substring Without Repeating Characters、Maximum Profit with Cooldown
【代码】【Challenge】No. 1。
2026-03-14 01:22:23
371
原创 【C/C++】TCP vs UDP 深度对比
连接 | 面向连接 (3-way handshake) | 无连接 || 可靠性 | 可靠 (ACK, 重传, 排序) | 不可靠 || 传输模式 | Byte stream | Datagram (message) || 有序性 | 保证顺序 | 不保证 || Flow control | Sliding window | 无 || Congestion ctrl | Slow start, AIMD 等 | 无 || Header 大小 | 20+ bytes | 8 bytes |
2026-03-09 23:39:48
396
原创 【C/C++】缺页中断 + 页面置换算法 详解
│ 算法 │ 淘汰谁 │ 缺页次数 │ Belady异常 │ 实际可用?││ OPT │ 未来最远不用的 │ 9(最少) │ 无 │ ❌ 不可实现 ││ FIFO │ 最早进入的 │ 15(最多)│ ⚠️ 有 │ ✅ 但效果差 ││ LRU │ 过去最久没用的 │ 12 │ 无 │ ✅ 开销较大 ││ Clock │ R=0 的页 │ ≈LRU │ 无 │ ✅ OS首选 │性能排序:OPT > LRU ≈ Clock >> FIFO。
2026-03-08 15:33:18
29
原创 【C/C++】虚函数表(vtable)与虚函数表指针(vptr)详解
编译期 运行期源代码 ───→ │ 编译器看到 │ │ 执行 构造函数 ││ 生成 vtable │──存入.rodata──→ │ │ vptr ──────→ vtableclass B:A { │ (每个类一张) │ │ │ 成员 │ │└──────────────┘ │ 对象诞生 │多态调用 p->f():│ p │ ──→ │ obj.vptr │ ──→ │ vtable[i] │ ──→ 正确的函数体基类指针 对象头部 函数指针数组知识点要记住的结论vtable 生成时机。
2026-03-08 15:15:37
283
原创 【C/C++】深入理解C/C++内存分配
特性new/delete来源C 标准库函数C++ 操作符类型安全返回void*,需手动转换返回正确类型指针大小计算手动指定字节数自动计算构造/析构❌ 不调用✅ 自动调用失败处理返回 NULL抛出可重载❌✅内存来源堆 (heap)自由存储区 (free store)std::cout << "=== FILE* 自定义删除器 ===\n";if (f) {std::cout << "关闭文件\n";fclose(f);
2026-03-08 14:45:06
323
原创 【C/C++】无锁SPSC环形队列
现代 CPU 以**缓存行(cache line)**为单位读写内存,通常是 64 字节。不对齐时的内存布局:Producer 写 tail_ → 整个缓存行失效Consumer 写 head_ → 整个缓存行失效两个核心不断争抢同一缓存行!对齐后的内存布局:Producer 只访问 cache line 2Consumer 只访问 cache line 1互不干扰!构造元素读取元素析构元素↔↔设计决策原因Capacity 必须是 2 的幂用位与代替取模,提升性能。
2026-03-08 14:12:03
371
原创 【C/C++】C++ 中的类型转换
日常写代码时的决策路径很简单。数值转换、枚举转换、已知类型的指针上下行转换,用。不确定实际类型的多态下行转换,用。对接遗留 API 需要去掉 const,用const_cast。需要在相同大小的类型之间重新解释比特模式(如看 float 的二进制表示),C++20 用,C++17 及更早用memcpy。只有在底层系统编程中实在没有替代方案时(指针转整数、处理硬件寄存器地址等),才使用。永远不要在 C++ 代码中使用 C 风格转换。每种 cast 的存在都对应一种特定的需求。用对了,类型转换是安全的工具;
2026-03-08 12:22:11
351
原创 【C/C++】Order Book实现(二)
上一篇文章我们从零构建了一个功能完整的订单簿,使用std::map管理价格档位,索引订单。这套实现逻辑正确、接口清晰,适合作为学习和原型验证的基础。但如果你把它放到一个真实的撮合引擎中——每秒处理数十万笔订单,每笔操作的延迟预算只有几百纳秒——它会成为整个系统的瓶颈。在不改变外部接口和撮合语义的前提下,如何通过替换底层数据结构将延迟降低一个数量级。从std::map到价格数组,从消除指针追踪,拥抱连续内存。现代 CPU 的计算速度远超内存访问速度,一次 cache miss 的时间足够执行上百条算术指令。
2026-02-23 02:01:27
426
原创 【C/C++】Order Book实现(一)
订单簿(Order Book)是交易所撮合引擎(Matching Engine)的核心数据结构。它维护着市场上所有未成交的限价单(Limit Order),按照价格优先、时间优先(Price-Time Priority,也叫 FIFO matching)的规则进行撮合。买方订单簿(Buy Book / Bid Book)中,出价最高的排在最前面,因为出价高的买家更积极;卖方订单簿(Sell Book / Ask Book)中,要价最低的排在最前面,因为要价低的卖家更积极。
2026-02-11 14:25:22
850
原创 【C/C++】线程池详解
线程池的核心是生产者-消费者模型:主线程生产任务放入队列,工作线程消费任务并执行。正确使用互斥锁和条件变量是实现线程安全的关键。需要特别注意锁的作用域、条件变量的等待方式、以及关闭时的资源清理。
2026-02-05 17:19:43
894
原创 【C/C++】Pipe与Socketpair详解
Pipe(管道)是 Unix/Linux 系统中最基本的进程间通信(IPC, Inter-Process Communication)机制。它提供一个单向的数据通道。Socketpair(套接字对)创建一对相互连接的 Unix domain socket(Unix 域套接字)。与 pipe 不同,它是双向的。│ ││ Pipe 管道: ││ ││ ││ 单向 One-way ││ ││ ││ Socketpair 套接字对: ││ ││ ││ 双向 Bidirectional │。
2026-02-04 00:12:51
660
原创 【C/C++】Linux epoll详解与实战
/ 服务器配置常量epoll 是 Linux 下高性能网络编程的基础,理解其工作原理和正确使用方式对于开发高并发服务器至关重要。│ 关键要点总结 ││ ││ 1. epoll 三个核心 API: ││ epoll_create1() - 创建实例 ││ epoll_ctl() - 管理文件描述符 ││ epoll_wait() - 等待事件 ││ ││ 2. 两种触发模式: ││ LT (Level Triggered) - 简单可靠,性能稍低 │。
2026-02-02 02:25:49
866
原创 【C/C++】UDP聊天室实现
│ 消息类型 ││ ││ JOIN = 1, // 加入聊天室 Join chat room ││ LEAVE = 2, // 离开聊天室 Leave chat room ││ CHAT = 3, // 聊天消息 Chat message ││ HEARTBEAT = 4, // 心跳请求 Heartbeat ping ││ HEARTBEAT_ACK = 5, // 心跳响应 Heartbeat pong ││ USER_LIST = 6, // 用户列表 User list │。
2026-02-01 01:08:11
400
原创 【C/C++】TCP聊天室实现与断线重连
/ Message Types 消息类型CHAT = 1, // 普通聊天消息 Normal chat messageJOIN = 2, // 用户加入 User join notificationLEAVE = 3, // 用户离开 User leave notificationSYSTEM = 4, // 系统消息 System messageHEARTBEAT = 5, // 心跳包 Heartbeat for keep-alive。
2026-01-31 23:56:23
982
原创 【C/C++】网络编程基础
Socket(套接字)是网络通信的端点,可以理解为应用程序与网络协议栈之间的接口。│ 网络分层模型 ││ ││ │ 应用层 │ ← 你的程序在这里 ││ │ 传输层 │ ← TCP/UDP ││ │ ││ │ 网络层 │ ← IP ││ │ ││ │ 链路层 │ ← 以太网/WiFi ││ │主动关闭方发送最后一个 ACK 后进入此状态持续时间:2 * MSL(MSL = Maximum Segment Lifetime,通常 30-60 秒)在此期间,该连接的四元组不能被重用。
2026-01-31 23:35:21
447
原创 【C/C++】线程安全队列、栈
在多线程编程中,数据结构的线程安全性至关重要。当多个线程同时访问同一个数据结构时,如果没有适当的同步机制,会导致数据竞争(data race)、数据损坏甚至程序崩溃。本文将详细介绍如何使用互斥锁(mutex)和条件变量(condition variable)实现线程安全的队列和栈,包括有界(bounded)和无界(unbounded)两种变体。│ 数据结构分类 ││ ││ 有界 (Bounded) 无界 (Unbounded) ││ • 固定容量 • 动态增长 │。
2026-01-29 00:07:49
361
原创 【C/C++】SPMC无锁队列
SPMC 队列与 MPSC 队列形成完美的对称。MPSC 中生产者竞争写入槽位,消费者等待数据就绪。SPMC 中消费者竞争读取槽位,生产者等待槽位空闲。两者都使用 CAS 解决竞争问题,使用ready标志解决同步问题,只是ready的语义相反。理解这种对称性后,实现新的队列变体就变得更加直观:找出哪一端有竞争,用 CAS 解决;找出谁需要等待谁完成,用标志位同步。
2026-01-28 23:01:34
548
原创 【C/C++】MPSC无锁队列
MPSC(Multi-Producer Single-Consumer)队列是一种允许多个生产者线程同时写入、但只有一个消费者线程读取的无锁数据结构。典型应用场景包括:多个业务线程向单一日志线程发送消息、多个工作线程向单一聚合线程汇报结果等。MPSC 队列相比 SPSC 的主要变化是生产者端使用 CAS 竞争槽位,以及引入ready标志解决写入可见性问题。消费者端逻辑相对简单,因为只有一个消费者,不需要竞争。这种设计在多个生产者、单个消费者的场景下提供了高效的无锁通信机制。
2026-01-28 16:10:37
758
原创 【C/C++】SPSC无锁队列
优化技术目的环形缓冲区(Ring Buffer)避免动态内存分配,O(1) 操作浪费一个槽位区分空和满,无需额外原子变量缓存行对齐(alignas(64))消除伪共享索引缓存(cached_head/tail)减少跨核原子读取release-acquire 语义保证数据可见性,避免过度同步无 CASSPSC 无竞争,直接 store 即可SPSC Queue 是无锁编程的入门案例,也是实际生产中高性能通信的基石。
2026-01-28 02:40:30
671
原创 【C/C++】自旋锁 Spin Lock
实现自旋锁需要注意以下几点。使用正确的内存序保证可见性。用 TTAS 模式避免缓存行颠簸。在自旋循环中加入 PAUSE 指令。根据场景选择是否需要公平性。明确自旋锁的适用场景,不要滥用。在高频交易等延迟敏感场景,自旋锁比互斥锁更合适,因为它避免了上下文切换的开销。但在锁竞争激烈或临界区较长的情况下,互斥锁可能是更好的选择。
2026-01-28 00:53:38
391
原创 【C/C++】生产者消费者
生产者-消费者模式看似简单,但正确实现需要对条件变量、互斥锁、原子操作和信号处理都有清晰的理解。关键点包括:使用两个条件变量避免死锁并精确唤醒正确类型的线程,理解 wait 的原子性释放锁和进入等待队列的机制,根据实际需求选择合适的内存序,以及优雅退出时需要唤醒所有等待线程。
2026-01-14 09:24:15
655
原创 【C/C++】Vector实现
实现一个完整的Vector内存管理:分离分配与构造,正确处理 capacity 和 size对象生命周期:placement new、显式析构、构造/析构顺序移动语义:移动构造、移动赋值、完美转发异常安全:强异常保证、、RAIIAllocator 模型、allocator 传播设计模式:copy-and-swap 惯用法这些概念不仅适用于Vector,也是实现其他标准库容器的基础。理解这些细节,将帮助你更好地理解和使用 C++ 标准库,也为实现更复杂的数据结构打下基础。
2026-01-11 16:44:20
551
原创 【C/C++】Optional实现
是一个可能包含值也可能为空的容器,用于显式表达"值可能不存在"的语义。它解决了传统方案的缺陷:用 -1 表示无效 ID、用 nullptr 表示无效指针、用空字符串表示无值——这些都需要额外约定且容易出错。的核心挑战与Vector<T>相同:需要一块内存,但对象不一定存在。我们必须手动控制对象的构造和析构时机。
2026-01-10 23:41:42
442
原创 【C/C++】SharedPtr实现
要点说明weak_count 初始为 1简化逻辑,避免多线程竞态对象和控制块分开删除strong=0 删对象,weak=0 删控制块增加计数用 relaxed只需保证原子性减少计数用 acq_rel需要同步内存lock() 必须用 CAS检查和增加必须是原子的复制赋值先 reset避免内存泄漏移动后置空源对象避免 double free。
2026-01-10 16:31:25
457
原创 【C/C++】UniquePtr实现
UniquePtr 是一个独占所有权的智能指针。同一时刻只有一个 UniquePtr 可以拥有某个对象。当 UniquePtr 销毁时,它所管理的对象也随之销毁。// 使用 p...} // 离开作用域,自动 delete不是所有资源都用delete// 文件句柄// C 库分配的内存// 自定义内存池。
2026-01-08 23:45:09
752
原创 【C/C++】RAII,Stack-only对象和Heap-only对象
│ RAII 核心 ││ ││ 构造 = 获取资源 ││ 析构 = 释放资源 ││ 对象死亡 = 资源释放 ││ ││ 好处 ││ ││ • 不会忘记释放 ││ • 异常安全 ││ • 代码简洁 ││ ││ 选择指南 ││ ││ 局部使用 → Stack Only ││ 需要共享 → Heap Only + shared_ptr ││ 不确定 → 普通 RAII ││ │。
2026-01-07 21:14:30
276
原创 【C/C++】Pair实现
构造函数用途关键点Pair()默认构造需要约束从任意值构造完美转发拷贝= default移动= default转换拷贝需要排除相同类型转换移动需要排除相同类型T1 first{};= default;requires(!requires(!requires(!
2026-01-07 02:40:46
394
原创 【多线程】CSP模式
概念说明Channel独立的通信管道,连接多个进程有缓冲 Channel异步,缓冲满时阻塞发送者无缓冲 Channel同步,发送者等待接收者send()发送数据,可能阻塞recv()接收数据,可能阻塞close()关闭 Channel,不能再发送Pipeline多个阶段串联处理多个 worker 并行处理ActorCSP通信方式直接发给 Actor通过 Channel邮箱归属属于 Actor独立存在耦合度较高较低典型语言。
2025-12-29 21:36:20
293
原创 【多线程】Actor模式
问题答案Actor 是什么有自己线程和邮箱的对象,串行处理消息线程安全吗是,mailbox_ 被 mutex 保护如何停止发送一个设置 stop_=true 的消息。
2025-12-29 21:04:46
258
原创 【C/C++】共享锁 Shared Lock
读写锁是一种特殊的锁,允许多个读者同时读取,但写者必须独占。普通互斥锁:│ 同一时间只能有一个线程(读或写) │读写锁:│ 读者1 读者2 读者3 ← 可以同时 ││ ││ 写者1 ← 必须独占(没有其他读/写)│概念说明readers_当前正在读的线程数writer_是否有线程正在写获取读锁,等待没有写者lock()获取写锁,等待没有读者和写者RAII构造时加锁,析构时解锁,防止忘记解锁概念说明等待中的写者数量,用于阻止新读者reader_cv_读者专用的条件变量writer_cv_
2025-12-29 13:45:11
193
原创 【C/C++】单例模式 Singleton
单例模式看似简单,但要写好并不容易。需要考虑线程安全、初始化时机、生命周期管理等诸多问题。饿汉模式以简洁换取灵活性,懒汉模式以复杂性换取控制力。理解两者的优劣,才能在实际开发中做出正确的选择。// 类的静态成员变量要在类外面定义,但是也可以加上inline让它在类的内部定义。这里没有加inlinepublic:Main start!
2025-12-28 15:30:01
705
原创 【ACWing】157. 树形地铁系统
想象一下,你是一名在拥有树形地铁系统的城市游玩的游客,你想探索该城市完整的地铁线路。一个树的最小表示法是递归定义的,从树根开始,向下走,然后求每个子树的最小表示,然后将所有子树的最小表示排序,最后返回树根。之后,你以一种特殊的方式回忆自己的坐车过程,你将你的完整地铁乘坐路线编码为一个二进制字符串。的时候递归求解子树的最小表示法,直到所有子树遍历完毕,然后将子树的表示排序,最后总结为整个树的表示。对于每个测试用例,如果两个字符串描述的探索路线可以视为同一个地铁系统的两种探索路线,则输出。,代表测试用例数量。
2025-12-19 18:10:39
653
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅