2013-08-27 3 views
1

My c progam не может создать больше, чем 8 threads. Он возвращает код ошибки EAGAIN(11). Это из-за нехватки ресурсов. Прежде чем публиковать этот вопрос, я искал его решение, но не мог получить от этого ничего. Вот подробности, которые я нашел для своей программы и системы unix.UNIX: Максимальное количество потоков в программе

Мои функции создания нити: -

thread_initialise(File *CFG_FILE) 
{ 
     int total_pthreads; //reads number of threads I want for the program from configuration file. 
     int rc =0 ; 
     for (i = 0; i < total_pthreads; i++) 
     { 
      rc = pthread_create (&pthread_list[i], NULL, (fp)(begin_worker_pthread), NULL); 
      if (rc !=0) printf("Thread creation Error Code: %d",rc); 
     } 
} 

памяти, потребляемый моей программы, а исполнение: pmap -x <pid> = 1111844

Unix Версия: uname -a = Linux 2.6.18-308.24.1.el5 #1 SMP Wed Nov 21 11:42:14 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

Thread Максимальное значение в UNIX cat /proc/sys/kernel/threads-max = 81920

ulimit -u max user processes (-u) 16000

ulimit -a 
core file size   (blocks, -c) unlimited 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 40960 
max locked memory  (kbytes, -l) 3000000 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 5857280 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 512000 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 16000 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

Пожалуйста, помогите, как максимальное число потоков вычисляется/фиксируется моей системой. Я хочу увеличить свои потоки до 32.

+0

Оставьте свой код. –

+0

Как насчет использования виртуальной памяти? и размер стека? ulimit -a покажет это. –

+0

Сколько ОЗУ - это машина, оборудованная? – alk

ответ

2

комплект ulimit -s 4000 из терминал. Теперь вы можете запускать больше потоков, чем раньше, но в какой-то момент вы встретите ошибку сегментации.

число потоков = общая виртуальная память/(размер стека * 1024 * 1024)

Число потоков для каждого процесса может быть увеличена за счет увеличения общей виртуальной памяти или путем уменьшения размера стека. Но уменьшение размера стека может привести к сбою кода из-за переполнения стека, а максимальная виртуальная память равна памяти подкачки.

дополнительную информацию см. this сообщение ясно объяснено.

+0

Это помогло мне, установив 'ulimit -s 4000'. но я не уверен, сколько минимального размера стека может быть для моей программы. Я боюсь, что это может привести к сбою программы в какой-то момент после ее выполнения. Виртуальная память уже «ulimit -v unlimited» – CodeCodeCode

+0

Максимальная виртуальная память равна памяти подкачки. setup swap memeory для вашего os это может помочь. Я не уверен в этом. – sujin

+0

отправить результат swapon -s – sujin

1

В конце концов, выше R & D Я нашел для своих систем то, что Maximum number of threads for program = Memory Size(RAM)/Stack Size. Этот расчет работал для моей системы.

Хотя у меня установлена ​​моя виртуальная память как неограниченная, я не могу увеличить количество потоков, чем приведенные выше вычисления.

В нерегулярном вопросе я попросил минимальный размер стека для программы, так что программа никогда не провалится. Вот ссылка: UNIX: What should be Stack Size (ulimit -s) in UNIX?

Смежные вопросы