Следующий код должен создать 100 000 потоков:
/* compile with: gcc -lpthread -o thread-limit thread-limit.c */
/* originally from: http://www.volano.com/linuxnotes.html */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define MAX_THREADS 100000
int i;
void run(void) {
sleep(60 * 60);
}
int main(int argc, char *argv[]) {
int rc = 0;
pthread_t thread[MAX_THREADS];
printf("Creating threads ...\n");
for (i = 0; i < MAX_THREADS && rc == 0; i++) {
rc = pthread_create(&(thread[i]), NULL, (void *) &run, NULL);
if (rc == 0) {
pthread_detach(thread[i]);
if ((i + 1) % 100 == 0)
printf("%i threads so far ...\n", i + 1);
}
else
{
printf("Failed with return code %i creating thread %i (%s).\n",
rc, i + 1, strerror(rc));
// can we allocate memory?
char *block = NULL;
block = malloc(65545);
if(block == NULL)
printf("Malloc failed too :( \n");
else
printf("Malloc worked, hmmm\n");
}
}
sleep(60*60); // ctrl+c to exit; makes it easier to see mem use
exit(0);
}
Он работает на 64-битной машине с 32 ГБ ОЗУ;Debian 5.0 установлен, все в наличии.
- ulimit -s 512, чтобы сохранить размер стека
- / proc / sys / kernel / pid_max, установленный на 1 000 000 (по умолчанию он отключаетсяна 32к пидс).
- ulimit -u 1000000 для увеличения макс процессов (не думаю, что это вообще имеет значение)
- / proc / sys / kernel / threads-max установлен на 1 000 000 (по умолчанию это не было 'не установлен вообще)
Запуск этого выплевывает следующее:
65500 threads so far ...
Failed with return code 12 creating thread 65529 (Cannot allocate memory).
Malloc worked, hmmm
У меня определенно не хватает оперативной памяти;Я даже могу запустить еще несколько этих программ, работающих в одно и то же время, и все они запускают свои потоки по 65 тыс.
(Пожалуйста, воздержитесь от предложения не пытаться запускать более 100 000 потоков. Это простое тестирование того, что должно работать. Мой текущий сервер на базе epoll всегда имеет примерно 200k + подключений и различные документы предполагают, что потоки могут быть лучшим вариантом. - Спасибо :))