Я использую pthread_cond_timedwait
в цикле потока для выполнения в каждый X мс (если только он не пробуждается первым).
Когда я иногда использую 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;
}
Если я запускаю его, он будет работать нормально, и если я буду работать в gdb, он также будет запускаться хорошо.
Я сузился до этих шагов (я назвал программу timedTest
):
Запустите программу;
Пока она работает, присоедините к ней gdb;
Выполните continue
on 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