分类
善良比聪明更重要
qBreakpad 踩坑记:ARM 平台崩溃转储收集 qBreakpad 踩坑记:ARM 平台崩溃转储收集
在 ARM 嵌入式平台上,程序崩溃后往往只留下一句模糊的报错,日志里很难定位到崩溃现场。qBreakpad 是基于 google-breakpad 封装的 Qt 库,可以在程序崩溃时自动生成 dump 文件,方便事后用符号文件还原调用栈。本
2021-01-31
C++ 内存碎片化:成因与解法 C++ 内存碎片化:成因与解法
内存碎片化是 C++ 在高并发服务中的一个关键性能顽疾。碎片分成两类:外部碎片——空闲的内存块零散、不连续,总的空闲内存充足,却无法满足大块内存的分配;内部碎片——分配出去的内存大于实际需求,剩下的空间被闲置。 高并发场景下,高频次的小内存
2020-08-02
C++ 双缓冲:读写分离 C++ 双缓冲:读写分离
1. 引言:为什么我们需要双缓冲?在现代软件开发中,尤其是在高并发、实时性要求极高的系统中,数据的读写分离是一个永恒的话题。最近在处理一个实时数据系统时,我遇到了数据库(MySQL)在高并发读写下的性能瓶颈。传统的加锁机制虽然能保证数据一致
2020-07-21
C++ 无锁编程原理 C++ 无锁编程原理
无锁编程(Lock-Free Programming)是现代并发编程中的一种重要技术,它避免了传统的锁机制,如互斥锁(mutex),并通过原子操作确保线程安全。无锁编程能够在多线程环境中显著提高程序的并发性和可伸缩性,减少线程之间的竞争、阻
2020-07-09
多线程写数组的设计方案 多线程写数组的设计方案
多线程环境下向数组添加数据的结构时,我们需要考虑线程安全。一般有几种常见的设计方案: 方案 1:互斥锁保护动态数组实现思路:使用互斥锁(std::mutex)保护对数组的每次操作,确保同一时间只有一个线程修改数组。这个方案是最简单最常见的,
2020-06-27
C++ 死锁排查:Shell + GDB 定位 C++ 死锁排查:Shell + GDB 定位
在 Linux 环境下进行 C++ 编程时,多线程能显著提升程序的并发处理能力,让程序在面对复杂任务时表现得更加高效。但多线程编程并非一帆风顺,死锁问题就像隐藏在暗处的”杀手”,随时可能让程序陷入僵局。 想象一下,你的程序原本运行得好好的,
2020-06-15
循环引用:用 shared_ptr 还是 weak_ptr? 循环引用:用 shared_ptr 还是 weak_ptr?
一、回顾循环引用问题当两个对象通过 shared_ptr 相互引用时,会产生循环引用问题,导致内存泄漏。因为这两个对象的引用计数永远不会变为 0,即使它们在程序的其他部分已经不被使用了。 典型循环引用: #include <memor
2020-06-03
enable_shared_from_this 的使用场景 enable_shared_from_this 的使用场景
enable_shared_from_this 是一个模板类,定义于头文件 <memory>,其原型为: template< class T > class enable_shared_from_this; 作用std::
2020-04-28
C++ 工程实践:值语义 C++ 工程实践:值语义
什么是值语义值语义指的是对象的拷贝与原对象无关,就像拷贝 int 一样。C++ 的内置类型 bool、int、double、char 都是值语义,标准库里的 complex<>、pair<>、vector<&g
2019-11-14
C++ 对象模型:内存布局详解 C++ 对象模型:内存布局详解
前言这篇文章希望对 C++ 对象的内存布局、虚表指针、虚基类指针等有深入介绍。 何为 C++ 对象模型引用《深度探索 C++ 对象模型》这本书中的话:有两个概念可以解释 C++ 对象模型: 语言中直接支持面向对象程序设计的部分。 对于各种
2019-10-31
C++ 右值引用 C++ 右值引用
概述右值引用的概念有些读者可能会感到陌生,其实它和 C++98/03 中的左值引用有些类似,例如,C++98/03 中的左值引用是这样的: int i = 0; int& j = i; 这里的 int& 是对左值进行绑定,但
2019-10-17
整型变量赋值是原子操作吗? 整型变量赋值是原子操作吗?
那么为什么整型变量的操作不是原子性的呢?常见的整型变量操作有如下几种情况:给整型变量赋值一个确定的值,如 int a = 1; 这条指令操作一般是原子的,因为对应着一条计算机指令,CPU 将立即数 1 搬运到变量 a 的内存地址中即可,汇编
2019-10-03
1 / 3