getTimeStr()函数正在调用___ lll_lock_wait_private(),这使线程进入死锁状态

问题描述 投票:0回答:1

[我已经看到许多问题,其中___lll_lock_wait_private ()陷入僵局。但是它们的调用堆栈是不同的。他们的代码叫malloc()free()fork()

但是就我而言,我有一个Log类,它正在尝试打印日志。该日志使我的线程陷入僵局。

请参见下面的调用堆栈,

#0  0x000000fff4c47b9c in __lll_lock_wait_private () from /lib64/libc.so.6
#1  0x000000fff4bf0364 in __tz_convert () from /lib64/libc.so.6
#2  0x000000fff4bee2c0 in localtime () from /lib64/libc.so.6
#3  0x000000fff5167188 in getTimeStr() () from /usr/sbin/sajet/sharedobj/liblibLite.so
#4  0x000000fff516756c in LogClass::logBegin() () from /usr/sbin/sajet/sharedobj/liblibLite.so
#5  0x000000fff5318c90 in DaemonCtrlServer::strtDaemon(daemonInfo&) () from /usr/sbin/sajet/sharedobj/libDaemonCtlServer.so
#6  0x000000fff531abc0 in DaemonCtrlServer::restrtDiedDaemon(daemonInfo&) () from /usr/sbin/sajet/sharedobj/libDaemonCtlServer.so
#7  0x000000fff531ae64 in DaemonCtrlServer::handleChildDeath() () from /usr/sbin/sajet/sharedobj/libDaemonCtlServer.so
#8  0x00000000100080ac in sj_initd::DaemonDeathHandler() ()
#9  0x000000001000b8f8 in sj_initd::SignalHandler(int) ()
#10 0x00000000100080e8 in sj_initd_SigHandler::sj_initdSigHandler(int) ()
#11 <signal handler called>
#12 0x000000fff4bedc00 in __offtime () from /lib64/libc.so.6
#13 0x000000fff4bf02a8 in __tz_convert () from /lib64/libc.so.6
#14 0x000000fff4bee2c0 in localtime () from /lib64/libc.so.6
#15 0x000000fff5167188 in getTimeStr() () from /usr/sbin/sajet/sharedobj/liblibLite.so
#16 0x000000fff516756c in LogClass::logBegin() () from /usr/sbin/sajet/sharedobj/liblibLite.so
#17 0x000000fff52e868c in ConnectionOS::ProcessReadEvent() () from /usr/sbin/sajet/sharedobj/libconnV2.so
#18 0x000000fff52ef354 in ConnectionOSManager::ProcessConns(fd_set*, fd_set*) () from /usr/sbin/sajet/sharedobj/libconnV2.so
#19 0x000000fff52f0a0c in SocketsManager::ProcessFds(bool) () from /usr/sbin/sajet/sharedobj/libconnV2.so
#20 0x000000fff52c51b4 in EventReactorBase::IO (this=0x19a65e80) at EventReactorBase.cpp:361
#21 0x000000fff52c457c in EventReactorBase::React (this=0x19a65e80) at EventReactorBase.cpp:419
#22 0x000000fff52c10cc in Task::Run (this=0x19a65e30) at Task.cpp:222
#23 0x000000fff52c1218 in startTask (t=0x19a65e30) at Task.cpp:152
#24 0x000000001000a9c4 in TaskManager::Start() ()
#25 0x0000000010007538 in main ()

sj_init是一个守护程序,它监视系统中其他守护程序的实时状态。当守护程序死亡(通过sj_init关闭连接)时,它将尝试重新启动该守护程序。然后,startDaemon()尝试打印日志,该日志正在调用getTimeStr(),该日志在内部调用___lll_lock_wait_private

c++ c deadlock
1个回答
0
投票

信号处理程序只能调用非常特定的一组功能。向下滚动到此处:https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03

[localtime()不在此集合内。

信号处理程序应该简短而简单。

您可以设置一个执行格式化和日志记录的线程,例如,通过管道,信号处理程序将通过管道将所有必要的信息进行格式化和日志记录。上面链接的集合中列出的are功能。

© www.soinside.com 2019 - 2024. All rights reserved.