pthread_cond_timedwait висит с GDB - PullRequest
6 голосов
/ 10 июня 2011

Я использую 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):

  1. Запустите программу;

  2. Пока она работает, присоедините к ней gdb;

  3. Выполните continueon gdb;

  4. Программа 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

1 Ответ

4 голосов
/ 10 июня 2011

Согласно этому сообщению на форуме , это ошибка в ядре 2.6.38 .Я сделал несколько тестов с ядром 2.6.39, и проблема не возникает.Откат к 2.6.38 снова появляется.

...