Почему pthread_create () завершится с ошибкой только с 2 активными потоками? - PullRequest
6 голосов
/ 08 марта 2009

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

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

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

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

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

Спасибо

Ответы [ 2 ]

10 голосов
/ 08 марта 2009

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

0 голосов
/ 08 марта 2009

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

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

...