2009-03-08 2 views
6

У меня возникли проблемы с моим первым набегом на потоки в C. Я пытаюсь (на данный момент) написать очень простую серверную программу, которая принимает соединение сокета и запускает новый поток для его обработки. Кажется, что он работает отлично, за исключением того, что он создаст около 300 потоков (303, иногда 304) до того, как pthread_create() завершится с кодом EAGAIN, что означает:Зачем pthread_create() терпит неудачу, если активен только 2 потока?

«В системе не было необходимых ресурсов для создания другого потока или превышен лимит системы на общее количество потоков в процессе {PTHREAD_THREADS_MAX}. "

Это не 303 темы одновременно - каждый поток выходит, что подтверждается gdb. Каждый раз, когда вызывается функция запроса процесса, выполняются два потока.

Значит, это означает, что «системе не хватало необходимых ресурсов». Мой вопрос (и это может быть немного глупо) - каковы эти ресурсы? Предположительно, это утечка памяти в моей программе (конечно, возможно, скорее всего, даже), но я бы подумал, что даже так, что он мог бы управлять более 300, учитывая, что остальная часть программы очень мало.

Как узнать, сколько памяти у моей программы доступно, чтобы подтвердить, что она заканчивается? Там много памяти и swap бесплатно, поэтому предположительно существует искусственный лимит, наложенный ОС (Linux).

Благодаря

+0

Вы можете разместить фрагмент кода, который создает и уничтожает потоки? –

ответ

10

Если вы не создаете нить с атрибутом PTHREAD_CREATE_DETACHED (или отсоединением их pthread_detach(), вам может понадобиться вызвать pthread_join() каждого созданного потока после его выхода, чтобы освободить ресурсы, связанные с ним.

+0

Thankyou! Просто установите этот атрибут, и прошло намного больше 4000 потоков и подсчета. Большое спасибо - это примерно 3 часа разочарования исправлено :) – Ray2k

0

Возможно немного избыточна (?), Но Valgrind может помочь вам найти memleaks в Linux.

Не могли бы вы опубликовать некоторые фрагменты кода? Предпочтительно те части, где вы выделяете/освобождаете память/сокеты и где создаете свои потоки.