Как исправить случайную ошибку EINVAL при вызове pthread_create - PullRequest
1 голос
/ 10 апреля 2019

Проблема

Когда я создаю отдельный поток с использованием приведенного ниже кода, pthread_create иногда возвращает EINVAL. Я хотел бы знать, почему это происходит и что я должен сделать, чтобы это исправить. При возникновении ошибки приведенный ниже код выведет следующую строку:

Ошибка создания потока. errno = 22: неверный аргумент

Что я пробовал

Эта проблема наблюдалась только при запуске моего кода в valgrind . Даже тогда, это только иногда производит эту ошибку. Таким образом, я склонен считать, что выбор времени является фактором. Я не думаю, что у меня есть состояние гонки, так как эта функция не зависит от каких-либо общих данных. Возможно, у меня есть проблема с тем, как я использую стек? Мне не удалось обнаружить какие-либо полезные подсказки на страницах руководства, за исключением того, что EINVAL означает «Неверные настройки в« attr »».

Я запускаю свое приложение в Ubuntu 14.04.

Код

/**
 * Creates a detached thread to receive data from the socket referred to by
 * sockfd.
 */
void recieve_async(int sockfd) {
    pthread_t receive_thread;
    pthread_attr_t attr;
    int error = pthread_attr_init(&attr);
    if (error != 0) {
        printf("attr_init failed. errno = %d: %s\n", error, strerror(error));
    }
    error = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if (error != 0) {
        printf("attr_setdetachstate failed. errno = %d: %s\n", error,
               strerror(error));
    }
    error = pthread_create(&receive_thread, &attr, receive, (void *)sockfd);
    if (error != 0) {
        printf("Error creating thread. errno = %d: %s\n", error,
               strerror(error));
        exit(1);
    }
    pthread_attr_destroy(&attr);
}

1 Ответ

2 голосов
/ 11 апреля 2019

Оказывается, это ошибка в Valgrind .Ошибка, о которой действительно нужно сообщить, - EAGAIN.

Функция receive_async вызывается несколько раз в секунду.Несмотря на то, что я создаю отдельные потоки, виртуальная среда Valgrind работает намного, намного медленнее, чем собственная среда.Таким образом, ситуация заключалась в том, что я создавал потоки быстрее, чем Valgrind мог их уничтожить.Valgrind накладывает ограничение на число потоков, с которыми он может работать, и ограничение по умолчанию составляет 500.

Я смог контролировать количество потоков, которые мое приложение использовало с помощью команды watch ps -o nlwp <pid>.При запуске его в Valgrind число потоков продолжало расти, до 500. При запуске вне Valgrind это число гораздо более разумно (около 4) и не увеличивается бесконечно.

...