我在线程循环上使用pthread_cond_timedwait
执行每X毫秒(除非它首先被唤醒)。pthread_cond_timedwait挂gdb
当我使用gdb进行调试时,它有时候不会返回函数。
This forum post也有同样的问题,但没有解决方案。
下面是一些代码能重现问题:
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
static pthread_cond_t s_cond = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t s_mutex = PTHREAD_MUTEX_INITIALIZER;
int main(int argc, char **argv)
{
int rc = 0;
struct timespec curts = { 0 }; /* transformed timeout value */
clock_gettime(CLOCK_REALTIME, &curts);
curts.tv_sec += 10; /* Add 10 seconds to current time*/
pthread_mutex_lock(&s_mutex);
printf("pthread_cond_timedwait\n");
rc = pthread_cond_timedwait(&s_cond, &s_mutex, &curts);
if (rc == ETIMEDOUT)
{
printf("Timer expired \n");
}
pthread_mutex_unlock(&s_mutex);
return 1;
}
如果我运行它,它会运行正常,如果我在gdb运行它也将运行确定。
我已经缩小到这些步骤(我命名方案timedTest
):
运行程序;
虽然它运行时将gdb附加到它;
在gdb上执行
continue
;timedTest
程序永远不会返回...;
然后,如果我在终端运行GDB打Ctrl+C
,再次运行continue
,然后程序会返回。
我可以在这种情况下使用其他方法来实现我想要的功能,但我认为它应该是解决这个问题的方法。
编辑:
看起来这只是在某些机器上发生的,所以也许有什么东西做用gcc/glibc的/ GDB /内核版本...
版本,其中发生这种情况几乎总是:
$ ldd --version
ldd (Ubuntu EGLIBC 2.13-0ubuntu13) 2.13
$ gcc --version
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
$ gdb --version
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
$ uname -a
Linux geovani 2.6.38-8-generic-pae #42-Ubuntu SMP Mon Apr 11 05:17:09 UTC 2011 i686 i686 i386 GNU/Linux
'info threads'在卡住的线程上显示任何有趣的东西吗? – 2011-06-09 21:55:07
这种情况发生的频率如何?我试图重现它,但到目前为止它还没有发生10次尝试。 – Ringding 2011-06-10 08:24:59
它几乎总是发生,但也许这与某些版本的gdb或glibc甚至linux内核有关...(增加版本的帖子) – Vargas 2011-06-10 12:37:02