字符串保留期间的 glibc malloc 死锁

glibc malloc deadlock during string reserve

本文关键字:glibc malloc 死锁 保留 字符串      更新时间:2023-10-16

从一段时间开始,我试图抓住我的产品挂起的问题。这是我在使用 gcore 核心转储进程后得到的调用堆栈:

/lib64/libc.so.6
#1  0x00007f36fb339ba6 in _L_lock_12192 () from /lib64/libc.so.6
#2  0x00007f36fb337121 in malloc () from /lib64/libc.so.6
#3  0x00007f36fbbef0cd in operator new(unsigned long) () from   /lib64/libstdc++.so.6
#4  0x00007f36fbc4d7e9 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) () from /lib64/libstdc++.so.6
#5  0x00007f36fbc4e42b in   std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) () from /lib64/libstdc++.so.6
#6  0x00007f36fbc4e4d4 in std::string::reserve(unsigned long) () from /lib64/libstdc++.so.6
#7  0x00007f36fbc2b3c6 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow(int) () from /lib64/libstdc++.so.6 
#8  0x00007f36fbc2fb36 in std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, long) () from /lib64/libstdc++.so.6
#9  0x00007f36fbc26885 in std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) () from /lib64/libstdc++.so.6
#10 0x00007f36fe85c83a in ?? ()
#11 0x00007f36fb2ffdff in vfprintf () from /lib64/libc.so.6
#12 0x000000000055c110 in fgetc@plt ()
#13 0xffffffffffffffa8 in ?? ()
#14 0xffffffffffffffa8 in ?? ()
#15 0x0000000000bc42a0 in ?? ()
#16 0x000000000055b8b0 in setsockopt@plt ()
#17 0x000000000055bf30 in log4cxx::NDC::push ()

这是在 log4cxx ndc 推送中分叉进程后执行的多线程代码。所有其他线程都睡在条件变量上,这是唯一一个死锁的线程。什么可能使马洛克陷入僵局?

你不应该分叉使用线程的进程。

如果其他线程之一在分叉期间获得了锁(假设malloc中的锁),则该锁将以锁定状态克隆,但锁定它的线程不会在分叉进程中运行。这意味着锁永远不会被释放。