Почему pthread_create() завершится неудачей только при 2 активных потоках?

StackOverflow https://stackoverflow.com/questions/622890

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Спасибо

Это было полезно?

Решение

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

Другие советы

Возможно, это немного перебор (?), но Валгринд может помочь вам найти memleaks в Linux.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top