我有一个运行多个线程的应用程序。在尝试分配std :: string时,我有2个线程似乎死锁。检查两个线程的回溯表明,在某些时候,一个人试图分配一个std :: string,并得到一个bad_alloc异常。在其catch块中,创建另一个字符串以尝试将调用堆栈写入某个日志文件。与此同时,另一个线程也试图分配一个std :: string,然后整个进程被卡住了。
以下是2个死锁线程的相关部分:
#0 0x004cf7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1 0x034ba3de in __lll_mutex_lock_wait () from /lib/tls/libpthread.so.0
#2 0x034b700b in _L_mutex_lock_35 () from /lib/tls/libpthread.so.0
#3 0x004e5fd4 in ?? () from /lib/ld-linux.so.2
#4 0x07c9f9bc in ?? () from /.../libstdc++.so.5
#5 0x00000037 in ?? ()
#6 0x07ca1714 in std::__default_alloc_template<true, 0>::_S_free_list () from /.../libstdc++.so.5
#7 0x9b2223a8 in ?? ()
#8 0x07c6ab7e in std::__default_alloc_template<true, 0>::allocate () from /.../libstdc++.so.5
#9 0x07c6ab7e in std::__default_alloc_template<true, 0>::allocate () from /.../libstdc++.so.5
#10 0x07c70b68 in std::string::_Rep::_S_create () from /.../libstdc++.so.5
#11 0x081c5ec0 in std::string::_S_construct<char*> ()
#12 0x081c33a2 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*> ()
#13 0x081c296e in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str ()
#14 0x02af7d7a in os::bad_allocation_t::bad_allocation_t () from /.../libmylib.so
#15 0x02af84a9 in operator new () from /.../libmylib.so
#16 0x07c6b0f1 in std::__default_alloc_template<true, 0>::_S_chunk_alloc () from /.../libstdc++.so.5
#17 0x07c6affd in std::__default_alloc_template<true, 0>::_S_refill () from /.../libstdc++.so.5
#18 0x07c6ab6c in std::__default_alloc_template<true, 0>::allocate () from /.../libstdc++.so.5
#19 0x07c78b2f in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_S_create () from /.../libstdc++.so.5
#20 0x07c78c59 in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_M_clone () from /.../libstdc++.so.5
#21 0x07c76996 in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::reserve () from /.../libstdc++.so.5
#22 0x07c76cff in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::append () from /.../libstdc++.so.5
在#14,你看到bad_alloc被包裹在我自己的异常类中被捕获,然后另一个字符串被创建 在#15你看到我自己的operator new,它只调用std :: malloc,检查它的返回值并在NULL时抛出bad_allocation_t
另一个主题是:
#0 0x004cf7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1 0x034ba3de in __lll_mutex_lock_wait () from /lib/tls/libpthread.so.0
#2 0x034b700b in _L_mutex_lock_35 () from /lib/tls/libpthread.so.0
#3 0x18f54584 in ?? ()
#4 0x07c9f9bc in ?? () from /.../libstdc++.so.5
#5 0x00000033 in ?? ()
#6 0x07ca1714 in std::__default_alloc_template<true, 0>::_S_free_list () from /.../libstdc++.so.5
#7 0x9b4236c8 in ?? ()
#8 0x07c6ab7e in std::__default_alloc_template<true, 0>::allocate () from /.../libstdc++.so.5
#9 0x07c6ab7e in std::__default_alloc_template<true, 0>::allocate () from /.../libstdc++.so.5
#10 0x07c78b2f in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_S_create () from /.../libstdc++.so.5
#11 0x07c78c59 in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_M_clone () from /.../libstdc++.so.5
#12 0x07c76996 in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::reserve () from /.../libstdc++.so.5
#13 0x07c76cff in std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::append () from /.../libstdc++.so.5
任何人都可以提供比我迄今收集到的更多的见解吗?
答案 0 :(得分:2)
尝试从新运算符中创建动态分配的字符串可能是一个非常糟糕的主意(特别是在您无法分配内存之后)。
我想发生的事情是std :: __ default_alloc_template递归使用是不安全的 - 很可能是因为它已经锁定了第16-18帧中的某些数据结构(使用非递归互斥锁)并尝试重新获取相同的互斥锁在第6帧(死锁因为它不是递归的互斥锁)。
答案 1 :(得分:0)
您的问题与this非常相似。确保您已指定-D_PTHREADS
和-D_REENTRANT
。希望这会有所帮助。