我正在使用pthread_cond_timedwait一个线程循环来执行每X ms(除非它首先被唤醒).
当我使用gdb进行调试时,它的功能永远不会返回.
这个论坛帖子也有同样的问题,但没有解决方案.
以下是一些可以重现问题的代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
如果我运行它,它将运行正常,如果我在gdb中运行它也将运行正常.
我已经缩小到这些步骤(我已经命名了程序timedTest):
运行程序;
它运行时附加gdb;
continue在gdb上执行;
该timedTest计划永远不会回归......;
然后,如果我点击Ctrl+C运行gdb的终端continue再次运行,那么程序将返回.
在这种情况下,我可以使用其他一些方法来实现我想要的,但我认为它应该是这个问题的解决方案.
编辑:
看起来这只发生在某些机器上,所以可能与gcc/glibc/gdb/kernel版本有关...
几乎总是发生这种情况的版本:
$ 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1561 次 |
| 最近记录: |