libgo icon indicating copy to clipboard operation
libgo copied to clipboard

tcp读取数据的时候,断开后一段时间后出现死锁

Open gooker opened this issue 1 year ago • 17 comments

centos7.8 gcc 10

场景很常见,目前一个设备,大约每秒1次执行下协程读取网口状态, 开始网络正常,然后断开设备网络,几个小时甚至更多就出现死锁,如下下数据 @yyzybb537 这个锁是libgo内部的吧

 go co_scheduler(sched_test) [=](){
                dev_tcp_status_check(id);
            };

死锁情况

Thread 10 (Thread 0x7f9a267c0700 (LWP 47760)):
#0  0x00007f9a2e0c854d in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x00007f9a2e0c3e9b in _L_lock_883 () from /lib64/libpthread.so.0
#2  0x00007f9a2e0c3d68 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x0000000000bec9aa in __gthread_mutex_lock (__mutex=<optimized out>) at /opt/rh/devtoolset-10/root/usr/include/c++/10/x86_64-redhat-linux/bits/gthr-default.h:749
#4  std::mutex::lock (this=<optimized out>) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/std_mutex.h:100
#5  std::unique_lock<std::mutex>::lock (this=0x7f9a267bc900) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/unique_lock.h:138
#6  std::unique_lock<std::mutex>::unique_lock (__m=..., this=0x7f9a267bc900) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/unique_lock.h:68
#7  libgo::RoutineSyncTimerT<std::mutex, std::condition_variable>::join_unschedule (id=..., this=0x7f9a2000a050) at /mnt/hgfs/vmshare/github/libgo/libgo/scheduler/../task/../routine_sync/timer.h:128
#8  co::Processer::WakeupBySelf(co::IncursivePtr<co::Task> const&, unsigned long, std::function<void ()> const&) (this=0x208c360, tkPtr=..., id=<optimized out>, functor=...) at /mnt/hgfs/vmshare/github/libgo/libgo/scheduler/processer.cpp:384
#9  0x0000000000bed19f in co::Processer::Wakeup(co::Processer::SuspendEntry const&, std::function<void ()> const&) (entry=..., functor=...) at /mnt/hgfs/vmshare/github/libgo/libgo/scheduler/processer.cpp:366
#10 0x0000000000c081f1 in co::ReactorElement::TriggerListWithoutLock (this=<optimized out>, revent=28, entryList=std::vector of length 1, capacity 1 = {...}) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/std_function.h:337
#11 0x0000000000c088c8 in co::ReactorElement::Trigger (this=this@entry=0x7f9a08001510, reactor=reactor@entry=0x7f9a2000a5c0, pollEvent=<optimized out>) at /mnt/hgfs/vmshare/github/libgo/libgo/netio/unix/reactor_element.cpp:78
#12 0x0000000000c0dc3a in co::EpollReactor::Run (this=0x7f9a2000a5c0) at /mnt/hgfs/vmshare/github/libgo/libgo/netio/unix/epoll_reactor.cpp:97
#13 0x0000000000c07711 in operator() (__closure=0x7f9a2000a5e8) at /mnt/hgfs/vmshare/github/libgo/libgo/netio/unix/reactor.cpp:47
#14 std::__invoke_impl<void, co::Reactor::InitLoopThread()::<lambda()> > (__f=...) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/invoke.h:60
#15 std::__invoke<co::Reactor::InitLoopThread()::<lambda()> > (__fn=...) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/invoke.h:95
#16 std::thread::_Invoker<std::tuple<co::Reactor::InitLoopThread()::<lambda()> > >::_M_invoke<0> (this=0x7f9a2000a5e8) at /opt/rh/devtoolset-10/root/usr/include/c++/10/thread:264
#17 std::thread::_Invoker<std::tuple<co::Reactor::InitLoopThread()::<lambda()> > >::operator() (this=0x7f9a2000a5e8) at /opt/rh/devtoolset-10/root/usr/include/c++/10/thread:271
#18 std::thread::_State_impl<std::thread::_Invoker<std::tuple<co::Reactor::InitLoopThread()::<lambda()> > > >::_M_run(void) (this=0x7f9a2000a5e0) at /opt/rh/devtoolset-10/root/usr/include/c++/10/thread:215
#19 0x00007f9a2faba4e0 in execute_native_thread_routine () from /lib/libpaho-mqttpp3.so.1
#20 0x00007f9a2e0c1ea5 in start_thread () from /lib64/libpthread.so.0
#21 0x00007f9a2d5cb8dd in clone () from /lib64/libc.so.6

gooker avatar Jul 31 '23 06:07 gooker