Проблема
Когда я создаю отдельный поток с использованием приведенного ниже кода, 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);
}