2009-12-22 3 views
11

Возможно ли каким-либо образом изменить лимит на число pthreads, которое может создать процесс? В настоящее время на моей Linux-системе я могу создать около 380 потоков, но я хочу увеличить это, чтобы сказать, пока доступна память.Изменение предела максимального числа pthreads приложением

+2

Интересно ... вы рассмотрели некоторые из последствий таких Системный дизайн? Единственная точка отказа (SPOF) приходит на ум. – jldupont

+0

Я не эксперт, но я бы поспорил, что более 380 потоков будут перегружать ваш процессор с помощью контекстных переключателей. Контекстное переключение для потока меньше, чем для отдельного процесса, но вам все равно нужно сохранить счетчик программ и зарегистрировать файл и, возможно, некоторые другие вещи, которые я забываю. Сколько потоков вы считаете нужным? Я бы предложил профилировать ваше приложение, чтобы определить поток накладных расходов для 10 потоков по сравнению с 100 потоками, а затем попытаться экстраполировать на целевое количество потоков. Вы можете обнаружить, что это не стоит усилий. Или, может быть, я просто ошибаюсь ... –

+0

Я не буду использовать его практически нигде ... но мне нужно это для некоторых экспериментов? – Sukanto

ответ

1

Посмотрите на это:

Maximum number of threads per process in Linux?

И смотреть на это, как это может относиться к вашему вопросу:

Serve one client with each server thread

+0

' кота?/proc/sys/kernel/threads-max' показывает '16384', но я не могу создать более 380 pthreads. Я даже попытался поместить пустую функцию как тело потоков. – Sukanto

+0

какая ошибка у вас получается? –

+0

после 380 потоков. Я получаю 'EAGAIN' в качестве возвращаемого значения' pthread_create() ', который согласно' pthread_create() 'man page is« Системе не хватало необходимых ресурсов для создания другого потока или системного ограничения на общее количество потоков в процессе {PTHREAD_THREADS_MAX} будет превышено. " – Sukanto

3

Ваша проблема заключается в том, что вы не вызвали pthread_detach на соответствующие темы. Это сообщает pthread, что ресурсы, связанные с каждым потоком, будут освобождены, когда поток завершится. Вы должны вызвать pthread_join или pthread_release для всех потоков, чтобы освободить ресурсы потоков. Это означает, что вам также нужно вызвать pthread_detach в обработчиках отмены pthread_join или утечке.

6

уменьшить размер штабеля пользователя 'ulimit -s 1024';

default: 8MB 
reduced: 1MB 

увеличить количество потоков.

установить размер стека: pthread_attr_setstacksize(1024)