这是在使用gcc 4.1.2和gdb 7.0的2.6.18-164.2.1.el5 x86_64内核的Redhat EL5机器上。
当我使用gdb运行我的应用程序并在运行时中断时,我的几个线程在执行回溯时会显示以下调用堆栈:
#0 0x000000000051d7da in pthread_cond_wait ()
#1 0x0000000100000000 in ?? ()
#2 0x0000000000c1c3b0 in ?? ()
#3 0x0000000000c1c448 in ?? ()
#4 0x00000000000007dd in ?? ()
#5 0x000000000051d630 in ?? ()
#6 0x00007fffffffdc90 in ?? ()
#7 0x000000003b1ae84b in ?? ()
#8 0x00007fffffffdd50 in ?? ()
#9 0x0000000000000000 in ?? ()
这是一个常见问题的症状吗? 在等待条件时查看调用堆栈是否存在已知问题?
答案 0 :(得分:3)
问题是pthread_cond_wait
是用手工编码的程序集编写的,显然在glibc
的构建中没有正确的展开描述符(在x86_64上需要展开堆栈)。最近可能已修复此问题here。
您可以尝试构建并安装最新的glibc(注意:如果你搞砸了安装,你的机器很可能无法启动;请小心处理!),或只是使用来自{{1}的“虚假”堆栈跟踪}。
答案 1 :(得分:1)
通常,当多个线程共享单个资源时,需要同步。
在这种情况下,当您中断程序时,您将看到只有1个线程正在运行(即访问资源),而其他线程正在pthread_cond_wait()
内等待。
所以我认为pthread_cond_wait()
本身并不成问题。
如果您的程序因死锁而挂起或性能无法扩展,则可能是由pthread_cond_wait()
引起的。
答案 2 :(得分:0)
这对我来说似乎是一个腐败的堆栈跟踪
例如:
#9 0x0000000000000000 in ?? ()
不应该有NULL代码