From da90f98fa9d1a8c3849020f6a2df524e45ddd636 Mon Sep 17 00:00:00 2001 From: zjk <1553836110@qq.com> Date: Wed, 19 Aug 2026 14:06:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9AUDP=20=E6=8E=A5?= =?UTF-8?q?=E6=94=B6=E9=98=9F=E5=88=97=E6=95=B0=E6=8D=AE=E7=AB=9E=E4=BA=89?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=20SIGSEGV=20=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pushMsgToQueue 在监听线程向各接收队列 push 时无锁, 而 clearMsgQueue/popMsgFormQueue 在 MOOS 主线程持锁 pop, 并发操作同一 deque 造成堆内存损坏,收到 140 CCU UDP 消息后崩溃。 为 6 处 push 补上与 clear/pop 对应的互斥锁 (m_mutexCcuState/CcuSetParm/DisHighVolBus/DisHighAVolBus/ DisHighBVolBus/DisLowBus),修复数据竞争。 --- src/pPowerManger/udpcomm/udpComm.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pPowerManger/udpcomm/udpComm.cpp b/src/pPowerManger/udpcomm/udpComm.cpp index e5e13a0..f269b24 100644 --- a/src/pPowerManger/udpcomm/udpComm.cpp +++ b/src/pPowerManger/udpcomm/udpComm.cpp @@ -178,6 +178,7 @@ bool udpComm::pushMsgToQueue(unsigned char *m) if(m_qReceiveCcuStateBuffer.size() lock(m_mutexCcuState); m_qReceiveCcuStateBuffer.push(std::make_pair(time, s)); } else @@ -201,6 +202,7 @@ bool udpComm::pushMsgToQueue(unsigned char *m) if(m_qReceiveCcuSetParmBuffer.size() lock(m_mutexCcuSetParm); m_qReceiveCcuSetParmBuffer.push(std::make_pair(time, s)); } else @@ -224,6 +226,7 @@ bool udpComm::pushMsgToQueue(unsigned char *m) if(m_qReceiveDisHighVolBusBuffer.size() lock(m_mutexDisHighVolBus); m_qReceiveDisHighVolBusBuffer.push(std::make_pair(time, s)); } else @@ -247,6 +250,7 @@ bool udpComm::pushMsgToQueue(unsigned char *m) if(m_qReceiveDisHighAVolBusBuffer.size() lock(m_mutexDisHighAVolBus); m_qReceiveDisHighAVolBusBuffer.push(std::make_pair(time, s)); } else @@ -270,6 +274,7 @@ bool udpComm::pushMsgToQueue(unsigned char *m) if(m_qReceiveDisHighBVolBusBuffer.size() lock(m_mutexDisHighBVolBus); m_qReceiveDisHighBVolBusBuffer.push(std::make_pair(time, s)); } else @@ -293,6 +298,7 @@ bool udpComm::pushMsgToQueue(unsigned char *m) if(m_qReceiveDisLowBusBuffer.size() lock(m_mutexDisLowBus); m_qReceiveDisLowBusBuffer.push(std::make_pair(time, s)); } else