自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(259)
  • 收藏
  • 关注

原创 qt信号槽机制以及底层实现原理

信号槽是 Qt 实现对象间解耦通信的机制,核心是 “事件触发 - 规则匹配 - 动作执行”;底层依赖 MOC 生成元对象信息,通过哈希表维护信号 - 槽映射,最终转化为函数调用;连接方式决定槽函数的执行时机(同步 / 异步),队列连接是跨线程通信的关键。

2026-03-17 15:40:40 378

原创 memory_order(内存序)

是 C++ 并发编程中控制线程间可见性和重排序的关键工具。通过选择合适的枚举值,可以在正确性和性能之间取得平衡。理解其语义需要结合原子操作和 happens-before 关系,通常最简单的方式是使用默认的seq_cst,只在需要精细控制并理解其后果时才选用较弱的内存序。

2026-03-15 21:42:36 322

原创 c++中的CAS是什么

CAS 是 C++ 并发编程的基石之一,通过提供的系列函数,开发者可以构建高效、无锁的并发算法。// 尝试将 counter 从 expected 更新为 desiredwhile (!// 如果失败,expected 已被更新为当前值,重新计算 desired//如果失败(说明 counter 被其他线程改了),expected 会被自动更新为最新的 counter 值,然后回到第 2 步,重新计算 desired 并再次尝试。明白了,这句的意思就是while (!

2026-03-15 21:10:46 412

原创 单例模式以及面试可能问的--精写

核心目标:保证类的实例唯一,提供全局访问点。推荐实现:C++11 + 优先用 Meyers 单例(懒加载、线程安全、代码简洁);C++11 前用饿汉式或 DCLP。适用场景:资源独占、状态共享、创建成本高的全局组件,避免滥用。

2026-03-14 13:54:35 531

原创 真正的小红书面试准备

代码段:存储程序的机器指令只读数据段:存储常量数据数据段已初始化数据段:存储已初始化的全局变量和静态变量BSS段:存储未初始化的全局变量和静态变量堆:动态分配的内存栈:函数调用和局部变量的存储区域explicit智能指针核心特性线程安全解决的问题unique_ptr独占所有权,禁止拷贝,支持移动语义需要外部同步操作同一个实例简单的独占资源管理shared_ptr共享所有权,引用计数,支持多指针共享控制块线程安全,对象本身需外部同步共享资源管理,但存在循环引用问题。

2026-03-11 19:54:33 335

原创 linux 以及 c++编程里对于进程,线程的操作

复制当前进程,返回两次(父进程得子进程PID,子进程得0)。– 阻塞等待指定线程结束,回收资源并获取返回值。– 父进程阻塞回收子进程资源,防止僵尸进程。进程独立地址空间,线程共享内存(需同步:互斥锁。进程退出码由父进程收集。,底层仍是pthread(Linux上)。– 使线程结束后自动释放资源,无需。– 创建新线程执行指定函数。– 让线程在后台运行,不再可。(标准C库,刷新缓冲区)或。:必须在线程对象销毁前调用。– 阻塞等待线程完成。– 构造即启动线程。(C++20)可自动。

2026-03-11 14:41:15 61

原创 Qt 信号槽跨线程的机制详解与YXS实际项目结合 及项目里进程线程关系分析

表格要点说明参数拷贝跨线程时,信号参数会被拷贝(通过 QMetaType),所以参数必须是可拷贝的队列投递postEvent是异步的,发完就返回,不阻塞发送线程事件循环接收方必须有 QEventLoop(主线程默认有),才能取出并处理事件线程安全槽函数执行时,是在接收线程中运行的,所以可以安全操作该线程的成员变量Qt 信号槽跨线程的本质,就是把 “调用” 封装成一个 QEvent,通过postEvent投递到目标线程的事件队列,目标线程的事件循环取出事件后才会真正执行槽函数。三层进程架构。

2026-03-05 15:21:56 388

原创 IOCP(I/O Completion Ports)详解

用于创建 IOCP 对象,或将一个句柄关联到 IOCP。当FileHandle为且为NULL时,创建一个新 IOCP。否则,将FileHandle关联到,并设置一个(通常用于传递上下文,如指向对象或索引)。工作线程调用此函数等待完成包。返回时,是传输的字节数,是关联时设置的键,指向提交 I/O 时使用的OVERLAPPED结构。用于向 IOCP 投递一个自定义完成包,通常用于通知工作线程退出或执行特殊任务。

2026-03-04 15:35:13 376

原创 伪共享与无锁队列解决伪共享

现代 CPU 不是以字节为单位从内存读取数据的,而是以缓存行(Cache Line)为单位。通常一个缓存行是64 字节(x86_64 架构)。当 CPU 核心需要访问某个变量时,它会将包含该变量的整个缓存行从内存加载到自己的 L1/L2 缓存中。缓存一致性协议(如 MESI)负责保证多个核心的缓存数据一致。

2026-03-04 08:43:47 370

原创 qt信号槽及其底层原理

你也可以轻松地定义自己的信号和槽来实现特定功能。c++Q_OBJECT // 必须的宏public:public slots: // 声明槽函数if (value!// 发射信号signals: // 声明信号// 信号只需声明,无需实现private:在其他地方,你可以连接并使用这个自定义的信号槽:c++// 将 a 的 valueChanged 信号连接到 b 的 setValue 槽// 这会触发 b.setValue(12) 的调用。

2026-02-28 21:38:13 588

原创 MVC(Model-View-Controller)经典的软件架构

MVC 是一种将数据(Model)、展示(View)和交互控制(Controller)分离的架构模式。它通过清晰的职责划分,让应用程序更易于管理、扩展和测试。尽管不同技术有各自的实现方式,但“数据与视图分离”的思想已经成为了现代软件开发的基础准则之一。

2026-02-26 12:13:52 576

原创 阻塞,非阻塞,同步,异步以及linux上的5种IO模型阻塞,非阻塞,信号驱动,异步,IO复用

同步/异步关注消息通信机制(谁主动获取结果)阻塞/非阻塞关注等待状态(调用后是否立即返回)Linux的5种模型是这些概念的具体实现组合实际开发中,epoll + 非阻塞I/O是最常用的高并发方案真正的异步I/O在Linux上仍有局限性,Windows的IOCP更成熟理解这些概念的关键是区分"等待数据"和"复制数据"两个阶段,以及"谁主动"这一核心问题你的理解几乎完全正确:✅ 两个阶段的划分:数据就绪 vs 数据读取✅ 阻塞/非阻塞主要影响数据就绪阶段✅ 同步/异步主要影响数据读取阶段。

2026-01-28 18:24:13 887

原创 c++hpc岗位

C++ HPC岗位,通常称为,核心是利用C++语言和一系列软硬件技术,,以解决需要海量计算资源的科学、工程或商业问题。这是一个典型的“硬核”技术岗,不仅要求深厚的编程功底,还需要对计算机底层(如CPU、GPU、网络、存储)有深刻理解。

2026-01-25 21:38:44 440

原创 MPI和mpiexec.exe

MPI是一个消息传递接口标准,用于编写并行计算程序。它定义了一组函数,用于在多个进程之间进行通信(发送和接收消息)。MPI不是一种编程语言,而是一个库,可以用C、C++、Fortran等语言调用。MPI是消息传递接口标准,用于编写分布式内存并行程序。是MPI实现的进程管理器,用于启动并行程序并管理进程。在CFD求解器中,MPI通过域分解实现并行计算,每个进程计算网格的一部分,并通过MPI通信交换边界数据。MPI程序需要专门的编译和运行环境,通常使用mpiccmpicxx编译,用mpiexec运行。

2026-01-25 21:32:52 963

原创 HDF5与CGNS文件格式详解

特性HDF5CGNS定位通用科学数据容器CFD领域专用数据标准关系底层存储技术上层数据模型规范组织结构自由的分层结构预定义的CFD数据模型主要用途任意科学数据存储CFD网格和结果数据交换扩展性完全自由,用户自定义遵循标准,但支持用户扩展学习曲线较陡峭(需理解API)更陡峭(需理解CFD概念+标准)工具生态丰富(h5dump, h5py等)CFD软件内置支持为主关键区别图示text# 原始CFD数据如何存储?

2026-01-25 14:50:54 942

原创 Qt中connect()实现信号与槽连接这一核心机制

信号(Signal)定义:当对象的内部状态发生改变时,它可以发射(emit)信号特点信号只有声明,没有实现(由moc自动生成)信号可以带有参数,用于传递数据信号可以连接到多个槽函数信号本质是一个特殊的成员函数Q_OBJECT宏:展开后声明元对象系统所需的方法moc(元对象编译器)处理头文件中的等生成moc_*.cpp文件,包含信号实现和元数据信号实现:moc为每个信号生成一个函数,发射信号时调用所有连接的槽类型安全的对象间通信松耦合的设计模式跨线程通信支持灵活的连接方式最佳实践优先使用。

2026-01-25 14:04:09 625

原创 并行计算: CUDA 12.9 (支持 GPU 加速), OpenMP (多核 CPU)

在程序中,这通常表现为对一个超大的数组或矩阵,所有元素同时进行相同的运算(如矩阵乘法、物理场网格点计算、图像滤镜处理)。您提到的这两项技术,就是召集“朋友”(计算单元)的两种不同方式,分别针对计算机中两种不同的“劳动力”。“12.9”是版本号。它代表了开发生态的一个稳定节点,包含了最新的特性(如对最新GPU架构的支持)和性能改进。,成员数量不多,但每个都能力超强,能独立负责复杂的子项目,并且沟通(内存共享)非常高效。,每只蚂蚁力量不大,但数量极多,纪律严明,擅长“蚁多咬死象”,完成海量重复性劳作。

2026-01-25 13:54:34 490

原创 【无标题】

从其分类(MCU→MPU→SoC)和架构升级(如ARMv4→v7→v8)可以看出,演化路径是:从低功耗、高集成度的专用控制,向高性能、高集成度的复杂应用处理发展,并融合DSP、GPU等能力,最终形成SoC。随着嵌入式系统功能日益复杂(从单一功能到多任务、网络、GUI),需要操作系统来管理系统资源(CPU、内存、外设),提供任务调度、同步通信机制,简化应用开发,提高软件的可维护性和可移植性。:指令精简、数量少、长度固定,强调使用频度高的简单指令,通过流水线提高效率,复杂功能由多条指令完成。

2026-01-17 17:34:46 525

原创 嵌入式系统

来源:《1.1 嵌入式系统设计概述.pdf》IEEE定义:“控制、监视或辅助设备、机器和车间运行的装置”。常见定义:以应用为中心、以计算机技术为基础、可裁剪软硬件、满足严格要求的专用计算机系统。:w:保存:w!:强制保存:q:退出:q!:强制退出:wq:保存并退出:wq!:强制保存退出:set nu:显示行号:set nonu:取消行号:复制行块:移动行块:n1,n2 d:删除行块:替换字符串答案(基于第4页):R0–R15:通用寄存器A1–A4:同R0–R3,用于入口参数、结果、暂存。

2026-01-10 12:05:30 709

原创 利用信号完成这个联动需求

只做基础初始化(创建曲线控件、默认不在此时调用,避免初始化顺序风险。只在时调用;这时所有 DataManager 和 case.json 解析都已经完成,的调用环境是安全的。曲线控件通过即时更新显示变量;MultiTableWidget 的行通过里的动态生成,不依赖全局刷新信号,因此不会引起属性树乱跳。所以,崩溃的本质是:在构造阶段过早调用了依赖全局状态(DataManager/KvislManager)的逻辑,触发了未完全初始化对象的访问。

2025-12-10 21:32:22 859

原创 Qt禁止子线程直接操作GUI

cpp// 自定义事件public:// 在主线程处理事件。

2025-12-08 22:12:41 1023

原创 Pimpl(Pointer to Implementation)设计模式详解

cpp// 传统方式 - MyClass.hpublic:MyClass();private:// 私有数据成员// 需要包含<vector>// 需要包含<map>// 需要包含第三方头文件// ... 更多实现细节问题编译依赖:任何包含MyClass.h的文件都会间接包含所有依赖的头文件编译时间长:修改私有成员会导致所有包含此头文件的文件重新编译暴露实现细节:用户能看到私有成员,违反了封装原则。

2025-12-06 13:32:24 997

原创 Http,Grpc

HTTP是一种应用层协议,用于在客户端和服务器之间传输超媒体文档(如 HTML)。它是万维网的数据通信基础。简单比喻:HTTP 就像我们日常的邮件通信系统。你写一封信(请求),贴上地址,投递到邮局邮局把信送到收件人收件人读信后写回信(响应),通过邮局送回给你gRPC是一个高性能、开源的远程过程调用框架,由 Google 开发。它基于 HTTP/2 协议,使用 Protocol Buffers 作为接口定义语言。简单比喻:gRPC 就像公司的内部电话系统。你直接拨打分机号(调用方法)

2025-11-30 15:55:01 922

原创 CMakeLists.txt

这是最接近真实项目的场景。假设你的项目由一个可执行文件和一个自己写的库组成,并且还使用了著名的fmt库。项目结构:text├── CMakeLists.txt (根目录的,管理整个项目)├── app/│ ├── CMakeLists.txt (子目录的,管理可执行文件)├── mylib/│ ├── CMakeLists.txt (子目录的,管理自己的库)1. 根目录的cmake。

2025-11-26 11:15:17 708

原创 unique_ptr内部实现细节

/ 编译时检查删除器是否可调用public:// 类型定义// 构造函数// 移动构造函数// 移动赋值操作符if (this!reset();// 析构函数if (ptr) {// 删除拷贝操作public:// 指针操作return ptr;return ptr;return ptr!= nullptr;// 释放所有权// 重置指针ptr = p;

2025-11-23 21:10:13 770

原创 虚假唤醒是啥

虚假唤醒是指:等待在条件变量上的线程,在没有收到任何通知(notify)的情况下,自己从等待状态返回。虚假唤醒是正常的:所有主流操作系统都可能发生总是使用循环检查条件:while循环或带谓词的wait条件变量必须与互斥锁配合使用在修改条件后记得通知或在锁外进行通知:避免被通知线程立即阻塞。

2025-11-23 21:08:42 683

原创 线程的阻塞和等待

buffer.empty()) { // 不断检查,消耗CPU。// 阻塞,等待磁盘I/O。// 阻塞,等待网络连接。// 通知等待的消费者。// 正确等待,不消耗CPU。// 唤醒等待的线程。// 如果锁被占用,线程阻塞。// 等待:有任务或线程池停止。// 2. 忙等待 - 消耗100% CPU核心。// 1. 条件变量等待 - 几乎不消耗CPU。// 1. I/O阻塞 - 几乎不消耗CPU。// 2. 线程进入等待状态。// 3. 网络阻塞 - 几乎不消耗CPU。

2025-11-20 20:24:27 607

原创 i++和++i

根本差异i++需要保存原始值并返回,++i直接返回新值对内置类型:现代编译器通常能优化掉差异对自定义类型++i明显更高效,避免临时对象创建最佳实践:默认使用++i,养成习惯cpp// 推荐:总是使用前置递增it!++it) {// ...// 只有在需要原始值时使用后置递增// 明确需要旧值这个习惯在C++编程中很重要,特别是在处理STL迭代器和自定义类型时。

2025-11-20 19:49:14 633

原创 https

客户端和服务端打招呼,并且把自己支持的TLS版本,加密套件,第1随机数发给服务端服务端打招呼,确认支持的TLS版本以及选择的加密套件,同时也生成一个第2随机数发给客户端,接着服务端还把证书和公钥发送给客户端,发送完毕客户端生成第3随机数,预主密钥(用刚刚收到的公钥进行加密后再发送出去)服务端收到加密后的预主密钥以后,用自己的私钥进行解密,这样服务器就知道预主密钥,而且只有客户端和服务端知道这预主密钥最后客户端,用预主密钥,第1随机数,第2随机数计算出会话密钥。

2025-11-18 21:12:12 1142

原创 堆和栈(程序内存里的和数据结构里的)

栈是快速通道(自动管理,小而快),堆是自由仓库(手动管理,大而慢)。用栈存小东西(局部变量),用堆存大东西(动态对象)——别忘了delete,否则内存会像雪球一样越滚越大!小数据 → 栈(局部变量、小数组)大数据 → 堆(动态数组、对象)堆内存 → 必须delete(否则内存泄漏)栈空间有限 → 别放大数组!💡面试加分句“在项目中,我们用栈存函数参数和局部变量,用堆存需要跨函数存活的数据。为了防止内存泄漏,我们用(C++11)自动管理堆内存。

2025-11-18 21:07:36 689

原创 Redis的主从同步,哨兵集群

主从同步:通过RDB快照 + AOF增量命令实现数据同步哨兵集群:通过多数派投票实现自动故障转移核心思想:用空间换时间(从节点备份),用复杂度换可用性(哨兵监控)记住,面试官问这个问题不只是想知道技术细节,更想了解你是否真正理解分布式系统的高可用设计思想。所以回答时要体现出你的系统思维和实践经验!项目阶段看似简单实际需要我的建议配置文件✅✅但需要理解每个参数含义环境准备❌✅重点!占40%时间故障测试❌✅不能跳过客户端连接❌✅不能直接连主节点监控报警❌✅。

2025-11-17 22:38:58 1042

原创 socket编程

服务器:创建Socket → 绑定 → 监听 → 接受连接 → 通信 → 关闭客户端:创建Socket → 连接服务器 → 通信 → 关闭Socket编程是网络开发的基石,可能一开始会有点难,但一旦掌握了,你就会发现它真的很酷!就像我第一次成功实现一个简单的聊天程序时,那种成就感简直无法形容。💡小贴士:在面试中,不要只说"我用过Socket",要说"我理解Socket的工作原理,知道TCP和UDP的区别,能处理常见的错误,比如连接超时、地址占用等。

2025-11-16 21:51:10 788

原创 每日做面经-25.11.16

weak_ptr。

2025-11-16 21:47:39 586

原创 用rand7()函数构造函数rand10()

以保证均匀分布。

2025-11-16 15:57:43 574

原创 有一个rand函数,生成1的概率是p,0的概率是1-p,那么如何用它生成一个rand2(),使得生成1和0的概率都是0.5

连续调用两次 rand(),直到得到不同结果,返回第一个值🧪 代码输出示例(实际运行结果)💡 为什么这个方法最优? 方法 期望调用次数 优点 缺点 成对比较法 ✅ 简单高效 ✅ 理论最优 ❌ 重试时浪费调用 暴力法 无穷 ❌ 无法保证等概率 ❌ 无法实现 期望调用次数计算: 一次尝试(两次调用)成功的概率 = 期望尝试次数 =

2025-11-16 15:47:04 699

原创 给定一个数组,如何用最小的比较次数获得最大最小值

💡:你有4个苹果,想找出最重和最轻的。暴力法:先两两比重→选出最重的(3次),再两两比轻→选出最轻的(3次),总共6次。

2025-11-16 15:41:51 273

原创 [特殊字符] 无锁线程安全循环队列实现(C++)

问题你的担忧事实为什么正确"需要把元素放回""会不会出问题"不需要!元素一旦入队,永久保留在缓冲区无锁实现"会不会有数据竞争"没有使用CAS和原子操作保证线程安全内存顺序"为什么用release/acquire"确保数据可见性避免编译器/处理器重排序💡面试金句"在无锁队列中,元素一旦入队,就永远留在缓冲区,通过指针移动来管理队列,不需要移动元素。这个实现是标准、正确、高效的,完全符合C++并发编程的最佳实践。面试官看到这个实现,会认为你对并发编程有深入理解。

2025-11-16 15:37:05 594

原创 条件变量 wait 方法的两种用法详解

你的改进思路是完全正确的!使用带谓词的wait语法更简洁:一行代码代替多行循环意图更明确:直接表达"等待直到条件成立"更安全:自动处理虚假唤醒更现代:符合C++11的最佳实践唯一的修正点是谓词逻辑需要与原代码的等待条件取反,这样就能获得更清晰、更安全的代码。

2025-11-15 12:45:29 921

原创 《C++ std::forward 完美转发详解》—— 从零开始,手把手教你理解

是 C++ 模板的"传值魔法"在模板函数中,它让参数的值类别(左值/右值)原封不动地传递给下一个函数避免拷贝,实现移动语义,是现代 C++ 高效代码的基石。

2025-11-14 11:43:09 683

原创 try_lock_for 详细解析:如何使用及避免死锁

是 C++ 中实现超时锁的关键机制它通过设置合理超时时间,避免线程无限等待在多锁场景中,能有效破坏死锁的'环路等待'条件使用时需注意超时时间设置和避免重复加锁是避免死锁最常用、最有效的策略之一在实际项目中,与try_lockstd::lock结合使用,能构建出健壮、高效的多线程程序,避免死锁问题。

2025-11-12 19:24:06 720

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除