- 博客(20)
- 收藏
- 关注
原创 C++中互斥锁、共享锁深度解析
本文介绍了C++标准库中的四种互斥锁机制:std::mutex、std::recursive_mutex、std::timed_mutex和std::recursive_timed_mutex。std::mutex是最基本的互斥锁,不支持递归加锁;std::recursive_mutex允许同一线程多次加锁;std::timed_mutex提供了带超时功能的锁获取机制;std::recursive_timed_mutex则同时具备递归和超时特性。文章详细说明了各种锁的特性、成员函数和使用方法,并提供了示例
2025-08-05 16:40:01
572
2
原创 C++继承关系中,深度解析类内存布局与多态的实现
在继承关系中,类内存的布局、虚基类的实现、虚函数的内存布局、多态的实现原理以及设计上的哲学体现。
2025-08-05 15:21:14
726
2
原创 操作系统进程切换与线程切换的优先级
当某个线程的时间片被耗尽,操作系统的调度会从全局就绪的线程队列中选择下一个要运行的线程进行运行。也就是说,进程切换是线程切换的附庸,是否需要进程切换并不是线程切换的考虑因素。线程切换时,如果切换到了同进程的线程,那么不需要进行进程切换,如果切换到了另外进程下的线程,那么需要进行进程切换,以满足目标线程的执行所需要的资源环境。由于线程切换的开销小于进程切换的开销,但操作系统对线程的调度不会为了避免进程切换而考虑从同进程中选择下一个要切换的线程。而操作系统调度算法的选择策略不强制优先同进程的线程。
2025-07-31 10:37:23
127
原创 C++多线程编程:深入理解thread
std::shared_future 是 C++11 引入的并发编程工具,它扩展了 std::future 的功能,允许多个线程安全地访问同一个异步操作的结果。std::thread对象本身不直接支持获取返回值,因为主线程无法直接访问子线程的栈内存,以下是需要获取返回值时的解决方案。唯一性:每个线程对象只能调用一次 join(),调用后对象不再关联任何线程(joinable() == false)。std::thread提供了创建和管理线程的能力,是现代 C++ 多线程编程的基础。
2025-07-04 17:24:37
585
原创 深度解析C++左值、右值与将亡值
值类别是表达式的属性。它描述了表达式可以如何被使用,而与内存的分配状态无必然的关联。左值(lvalue):有标识的表达式纯右值(prvalue):无标识的可移动表达式将亡值(xvalue):有标识的可移动表达式左值(lvalue)是指那些可标识持久存在的对象(生命周期超出了表达式求值的持续时间)。(1)可标识(左值必有的特征)可标识是指可被区分,可被唯一识别。在左值的语境中,可标识是指对象具备固定的、可被追踪的内存空间。有名称也可以被作为可标识的依据。
2025-07-04 15:45:54
632
2
原创 多线程之间的同步机制—promise<T>和future<T>
promise是结果生产者,有以下关键的成员函数。std::future 是 C++11 引入的并发编程核心组件。它提供了一种安全、标准化的机制来获取异步操作(如线程、任务)的返回值或异常。std::shared_future 是 C++11 引入的并发编程工具,它扩展了 std::future 的功能,允许多个线程安全地访问同一个异步操作的结果。与只能移动的 std::future 不同,shared_future 是可复制的,这使得它在广播式通知和多个消费者场景中特别有用。
2025-07-01 11:55:14
774
原创 PDB文件的介绍、生成、使用方式
PDB(Program Database)文件被称为符号文件它核心功能是存储程序中的“符号”(Symbols)信息,这些符号是连接二进制机器码与人类可读的源代码之间的关键桥梁。什么是“符号”?在编程中,“符号”函数名(如main变量名(如userCountisEnabled类名/结构体名(如CustomerVector3全局变量静态变量类型定义等。在编译过程中,这些符号会被转换为内存地址,以便计算机执行。但调试时,我们需要将这些地址或标识符“还原”为开发者熟悉的符号名称——
2025-06-20 19:52:32
405
原创 使用WinDbg进行堆内存动态分析(二)
heap-s可查看),每个堆有多个Segment(每个Segment是连续的内存),每次分配的Entry都在各个Segment上。.frame 0x8 :切换到调用栈中的第8帧(frame),准备查看该帧的局部变量、寄存器等上下文信息。指针pstr1指向的内存写入时,会大概率覆盖pstr2指向的内存,导致pstr2指向的堆内存损坏。如果开启完整页堆调试,可以在内存溢出处检测到异常,而非访问被溢出所覆盖的内存时。意味着:堆管理器的内部结构破坏,通常在释放内存时被检测到。可直接定位到内存溢出的代码。
2025-06-19 15:09:59
855
原创 使用symchk下载对应的dll和pdb文件
使用symchk.exe,依据C:\Windows\System32\中的dll文件,去网址http://msdl.microsoft.com/download/symbols中,下载dll对应的pdb文件,将其下载到 D:\PDB\pdbfile路径中。使用symchk.exe,依据D:\PDB\info1.txt中的版本信息,去http://msdl.microsoft.com/download/symbols网址中,下载对应的pdb文件和dll文件。2,依据dll文件去下载dll对应的pdb文件。
2025-05-23 20:09:39
210
原创 使用gflags对进程开启Full Page Heap调试
启用完整页堆会使得每次内存分配都在内存页的边界上进行,且在每个分配的内存块后添加一个不可访问的内存页作为保护区域。这意味着一旦程序试图越界访问内存,操作系统会立即报告错误,从而帮助开发者快速定位问题。
2025-05-16 20:13:06
433
原创 gflags.exe启用用户模式堆栈跟踪
(Debugging Tools for Windows)中的一个重要工具,主要用于配置应用程序的运行时调试选项。它可以通过修改注册表或系统标志,启用特定的调试功能,帮助开发者诊断内存泄漏、句柄泄漏、内存越界访问等问题。:结合Windbg等调试器,可分析未释放的内存块及其分配位置,快速定位泄漏源头。:Windows调试工具,用于配置应用程序的运行时调试选项。启用UST会轻微增加内存和性能开销,建议仅在调试时使用。:启用后,系统会记录程序每次分配内存时的调用堆栈。命令查看堆分配记录及关联的堆栈信息。
2025-05-10 14:52:49
350
原创 WinDbg附加到进程的几种方式
启动WinDbg,点击File-Open Executable。目标程序会被Windbg启动,并被中断。③在列表中选择目标程序(新启动的进程一般在列表下面)。此时被附加的程序会被Windbg中断。输入指令g,可继续执行。不论是WinDbg附加到进程、还是WinDbg直接启动软件,关闭WinDbg后,目标进程也会随之关闭。②使用命令行启动Windbg,并附加到目标进程,并使用g指令使程序继续执行。快捷键Win+R,输入cmd,输入如下命令行后回车。快捷键Win+R,输入cmd,输入如下命令行后回车。
2025-05-09 15:05:57
357
原创 JSON文件的格式说明
一个 JSON 文件通常由一个 JSON 对象或一个 JSON 数组组成。JSON对象的键值对之间、JSON数组的值之间,使用逗号分隔。JSON对象的值,可以是上述数据类型的任何一种。JSON数组的值,可以是上述数据类型的任何一种。JSON对象的键,只能是字符串。使用双引号括起来的文本。
2024-11-12 09:10:14
298
原创 C++打印调用堆栈
使用C++开发时,为了理清代码的执行顺序,有时需要将当前执行进度的调用堆栈打印下来。为了方便使用,提供下面的Demo,打印调用堆栈。
2024-09-20 14:43:13
974
2
原创 执行Nsis的卸载程序
有这么个问题,当我写代码使用QProcess::start运行uninse.exe时,执行完start后,再使用waitForFinished,这个waitForFinished并不会等待uninst.exe的执行完毕。导致waitForFinished得到的是复制前的exe的运行结果,而不是复制后的,就导致waitForFinished得到的并不是我想要的exe运行结果。第3.2.2节的说法,可以在使用start调用c:/MMA/uninst.exe时,最后一个参数设置为”_?
2024-09-18 14:57:31
442
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人