From 2faa04da300234a9dc41b488a772c0a6f4cea4d0 Mon Sep 17 00:00:00 2001 From: yingxiaodong Date: Mon, 1 Sep 2025 11:35:50 +0800 Subject: [PATCH] =?UTF-8?q?bug-fix:=20rtpserver=E6=AD=BB=E9=94=81=20(#4421?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、RtpServer对应的socket在读取数据后,会加锁后进行数据处理 a) LOCK_GUARD(_mtx_event); b) _on_multi_read 当_on_multi_read处理中出现问题,会通过回调,调用 s_rtp_server.erase(key); , 这里锁的调用顺序为:_mtx_event -> s_rtp_server._mtx 2、当外部调用api关闭RtpServer时,会先调用 s_rtp_server.erase(key); ,释放RtpServer对象时,会调用Socket的 setOnRead(nullptr),这里会调用Socket的 _mtx_event。 这里的锁调用顺序为:s_rtp_server._mtx -> _mtx_event 以上两种情况,存在 交叉调用两把锁的问题,会出现死锁。 --- server/WebApi.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 7d26214e..278d524f 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -330,8 +330,17 @@ public: } size_t erase(const std::string &key) { - std::lock_guard lck(_mtx); - return _map.erase(key); + Pointer erase_ptr; + { + std::lock_guard lck(_mtx); + auto itr = _map.find(key); + if (itr != _map.end()) { + erase_ptr = itr->second; + _map.erase(itr); + return 1; + } + } + return 0; } size_t size() {