你的 C++ 服务 stop() 顺序很可能有问题
一、一个问题你的服务有没有这种情况:跑起来一切正常,Ctrl+C 一按就段错误?偶尔能干净退出,偶尔 core dump?日志里最后几行是乱序的,有时候甚至看不到 fatal 信息? 如果有,恭喜你——你的 stop() 顺序大概率是错的。 二、一个真实案例一个基于 MQTT 的无人机控制服务(C++、Linux、多线程)。运行态一切完美:消息收发正常,日志正常,CPU 和内存正常。但只要退出程序,Valgrind 就报 112 个 use-after-free 错误。 调用链长这样: 123Logger::workerThread() // 后台线程,处理日志队列 → LogPublisher::publish() // 封装日志为 protobuf,调用 MQTT 发送 → MqttClient::publish() // 实际发送 MQTT 消息 原始的 stop(): 1234567void SystemFactory::stop(){ ...
C++ 服务崩溃复盘:从 Valgrind 112 个错误到零
一、十点夜晚的 Valgrind 日志那是一个周四的晚上。我已经盯着终端看了一个小时,屏幕上是一份 Valgrind 报告——112 个错误,全是 use-after-free。 123456789101112==3300263== Invalid read of size 1==3300263== at 0x4852A10: memmove==3300263== by 0x60818AD: basic_streambuf::xsputn==3300263== by 0x6073B64: __ostream_insert==3300263== by 0x15C2DB: operator<<==3300263== by 0x15C2DB: MqttClient::publish (mqttClient.cpp:382)==3300263== by 0x1935E7: LogPublisher::publish (LogPublisher.cpp:68)==3300263== by 0x191540:...
戏班子的收场锣
...
静态局部变量在多线程下的线程安全问题
在C++编程中,静态局部变量是一个常见但容易被忽视的线程安全问题来源。本文将深入分析静态局部变量在多线程环境下的行为、潜在问题以及解决方案。 一、静态局部变量的基本特性1. 什么是静态局部变量静态局部变量是在函数内部声明的static关键字修饰的变量,它具有以下特点: 123456789101112void func() { static int counter = 0; // 静态局部变量 counter++; printf("Counter: %d\n", counter);}int main() { func(); // Counter: 1 func(); // Counter: 2 func(); // Counter: 3 return 0;} 2. 静态局部变量的存储特性 生命周期:程序启动时分配,程序结束时释放 作用域:仅在声明的函数内部可见 初始化:仅在第一次调用时执行初始化,之后保持上次值 123456789// 静态局部变量的初始化时机void...
Python多线程编程深度解析
一、多线程的基本概念在Python中,线程是程序执行的最小单位。多线程编程允许程序同时执行多个任务,提高程序的执行效率。 二、线程的创建与启动1. 使用threading模块123456789101112131415161718192021import threadingimport timedef task(name): print(f"Task {name} started") time.sleep(2) print(f"Task {name} completed")# 创建线程thread1 = threading.Thread(target=task, args=('A',))thread2 = threading.Thread(target=task, args=('B',))# 启动线程thread1.start()thread2.start()#...

