Начал я тут разбираться с потоками. Нужно мне запускать кучу коротких потоков, и не дожидаясь их окончания дальше продолжать программу, запуская по ходу другие потоки.
И тут я наткнулся на то, что потоки вроде и завершаются, но не выгружаются из памяти. В результате течет память, а где-то на ~380-м создаваемом потоке функция pthread_create() возвращает ошибку 11.
Вот минимальный пример. Компилирую командой
g++ -L/usr/lib -x c++ -o sample sample.cpp -lm -lpthread
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define SLEEP1 25000
#define SLEEP2 60000
static void *threadFunc(void *arg);
int main (int argc, char *argv[])
{
for(int iteration=1; iteration<1000000; iteration++)
{
pthread_t thread;
int result=pthread_create(&thread, NULL, threadFunc, (void*)iteration);
if(result != 0)
{
printf("Creating thread false. Error: %d\nPress enter to exit\n", result);
scanf("> \n");
exit(1);
}
usleep(SLEEP1);
}
exit(0);
}
static void *threadFunc(void *arg)
{
int iteration = (int) arg;
printf("Thread %d start\n", iteration);
usleep(SLEEP2);
printf("Thread %d end\n", iteration);
return NULL;
}
Пробовал добавлять в конец функции threadFunc() перед return NULL; команду pthread_exit(NULL);. Поведение то же самое, память течет, новый поток перестает создаваться на ~380-й итерации.
В чем тут проблема, как модифицировать этот пример чтобы он обрабатывал все итерации, и не текла память?