- 博客(17)
- 收藏
- 关注
原创 从0开始学QNX架构(二)
虽然进程中的线程共享进程地址空间中的所有内容,但每个线程仍然具有一些“私 有”数据。在某些情况下,该私有数据在内核中受到保护(例如,tid 或线程 ID),而其他私有数据在进程的地址空间中不受保护(例如,每个线程具有供其自己使用的堆栈)。一 些更值得注意的线程私有资源是:TID:每个线程由整数线程 ID 标识,从 1 开始.tid 在线程的进程中是唯一的。优先级:线程从其父级继承其初始优先 级,但优先级可以更改,具体取决于调度策略,线程所做的显式更改或发送到线程的消 息。
2025-11-02 15:24:40
486
原创 linux常用命令
如下目录结构 newfile文件下有 newpage2 newpage文本 和newtest文件夹,newtest中有newtest文本。别忘了 我们最开始的newtest中还有一个testpage.txt呢。但是执行rm -r删除文件夹后 文件中文件也一并删除了。这样我们就创建了一个newpage的txt文件。由于当前文件是新创建的还没有任何东西,
2025-10-20 14:04:58
265
原创 编程概念篇-设计模式和原则
当创建逻辑比较复杂,是一个“大工程”的时候,我们就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。具体来讲,当一个系统中存在大量重复对象的时候,我们就可以利用享元模式,将对象设计成享元,在内存中只保留一份实例,供多处代码引用,这样可以减少内存中对象的数量,以起到节省内存的目的。如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。
2025-10-16 16:09:57
1006
原创 Cmake 教学从0开始 干货满满直接上手(三)
可以显式地设置它的值,或者让 CMake 根据默认规则来确定。CMake 常用的构建类型:-g-O0(禁用优化)-O3(最高级别优化),-DNDEBUG(禁用断言)-O2(适度优化),-g-Os(优化代码大小),-DNDEBUG。
2025-10-16 15:32:43
392
原创 Cmake 教学从0开始 干货满满直接上手(二)
检查特定语言的编译器是否已成功加载 CMAKE_<LANG>_COMPILER_LOADED。除修改CMakeLists外 还可通过修改Cmake命令选项来覆盖全局编译标志。指定可执行文件和库文件的输出目录 EXECUTABLE_OUTPUT_PATH。4.增加编译选项 && 添加静态库 && 静态库编译选项。控制Makefile输出详细信息。昨天我们学到了添加静态/动态库。全局编译选项(如警告、优化)指定交叉编译工具链文件路径。指定C/C++编译器路径。1. 指定版本和项目名称。3. 设置C++版本。
2025-10-14 17:04:32
283
原创 Cmake 教学从0开始 干货满满直接上手(一)
首先CMake 本身不负责编译你的源代码,只是生成Makefile构建文件其次CMake 不会直接编译代码,文件也不是脚本。核心是优势在于:读取文件,生成适用于不同平台的构建系统文件,而无需关心不同平台的构建细节。
2025-10-13 17:22:16
973
原创 C++ 软件调试 GCC/G++编译参数
fsanitize=thread //可检测多线程程序中的数据竞争和其他线程相关错误。编译后的程序会在运行时收集函数调用信息和计时数据。-fsanitize=address //堆栈溢出、全局变量溢出等内存错误。-fsanitize=undefined //检测代码中未定义行为。-fsanitize=memory //检测未初始化内存的读取。-fsanitize=leak //可检测程序中的内存泄露。
2025-10-10 16:51:32
619
原创 C++ 软件调试--linux生成Core文件
core_pattern 是在 /proc/sys/kernel/ 下的系统文件,用来指定生成Core文件的路径和命名格式。若想永久生效在在 /etc/sysctl.conf中 在文件末尾加上core文件的存储路径而后重启系统即可。ulimit -c 命令设置或获取core文件大小限制,可指定在程序崩溃时可创建的核心转储文件最大大小。简单修改 core_pattern 文件的设置选项只在当前系统运行时有效,重启后会被恢复成默认值。注:此命令设置的core文件大小只在当前终端、当前用户生效。
2025-10-10 11:33:00
341
原创 常用两种单例模式-线程安全版
首次调用:一个线程执行初始化函数,其他线程阻塞等待,仅在首次调用时加锁,初始化完成后替换为无锁检查。核心思想:使用std::call_once和std::once_flag,或原子指针配合内存屏障,避免锁的开销。异常处理:若初始化函数抛出异常,call_once 会捕获并传播异常,允许后续重试(直到成功)。call_once 仅执行简单的状态检查,开销极低。std::once_flag:与call_once配合使用,标识初始化状态。std::call_once:保证函数仅被调用一次,内部实现高效线程安全。
2025-10-10 09:55:25
132
原创 Debug调试原理(三)
说到调试我们不得不想起内存损坏,而内存损坏通常都是复写不属于自己的内存,或越界等。至于常说的内存溢出和下溢指的是:超过当前块大小的内容写到其他内存块中。一般版本当释放后和申请的内存一样大时会很快分配给用户,版本存在保护页机制, 既被释放的内存不会立即被内存管理器立即提供给用户。这也是为什么一般在例行版本是发生的崩溃在调试版本中不会复现的原因。
2024-08-08 18:22:01
852
原创 Debug调试原理(二)
当我free的时候,ptmalloc会根据传入的指针找到对应的块,使用size来确定要释放的大小,这样ptmalloc就能将这个内存块标记为空闲状态,将其加入到空闲链表中。:用于记录前一个空闲内存块的大小。当一个内存块被释放时,会检查前后相邻的内存块是否也是空闲的,如果前一个是空闲的,prev_size可以知道前一个内存块的大小,从而将两个空闲块合成一个更大的空闲块,减少碎片化提升利用率。ptmalloc会维护一个链表来管理已经释放的内存块,以便下次分配时可以直接使用这些空闲的内存块,而不需要重新申请。
2024-08-07 13:41:35
710
原创 Debug调试原理(一)
调试符号可将进程的指令与对应的源代码行数或表达式进行关联,或者从源程序声明的结构化数据对象的角度对一块内存进行描述。通过这些映射,调试器可在源代码层面上执行用户命令来查询和操作进程。g++ -g cui.cpp cui.o 即可生成带调试符号的.o文件简单理解为: 调试符号是源程序和程序运行实例的原始内存内容之间的桥梁.
2024-08-07 11:58:28
1311
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅