void * send_client(void *arg){
printf("[master] client connected \r\n");
to_connect conn;
memcpy(&conn,arg,sizeof(to_connect));
die_client(conn.client);
pthread_exit(NULL);
}
Linux потоки
Есть сервер принимающий соединения - каждый клиент в отдельном потоке.
После ~500 соединений потоки перестают создаваться с perror "Cannot allocate memory"
Я вижу что дело в том что после выполнения работы потока за ним не освобождается память, т.к. когда я делаю тоже самое но в одном потоке (делаю сервер однопоточным) всё прекрасно.
я убрал из потока весь код кроме следующего, но память всё равно кончается:
Код:
Подскажите как освободить память потока?
ну лично я тут ни чего не вижу, покажи как создаешь потоки, как запускаешь и так далее.
Код:
client.client=client_socket;
printf("pthread create: %d\r\n",&clients[myclients].thread[nowclient]);
pthread_attr_init(&clients[myclients].attr[nowclient]);
int result_pth=0;
result_pth = pthread_create(&clients[myclients].thread[nowclient], &clients[myclients].attr[nowclient], send_client,&client);
if (result_pth!=0){
perror("can not create thread");
}
printf("pthread create: %d\r\n",&clients[myclients].thread[nowclient]);
pthread_attr_init(&clients[myclients].attr[nowclient]);
int result_pth=0;
result_pth = pthread_create(&clients[myclients].thread[nowclient], &clients[myclients].attr[nowclient], send_client,&client);
if (result_pth!=0){
perror("can not create thread");
}
clients[myclients].thread и clients[myclients].attr - динамические массивы, их размер контролируется с помощью функции die_client(conn.client) вызываемой в коде потока при его завершении.
по результатам тестов максимальный размер массива был равен 1, но сервер всё равно падает.
Как то это странно....
ОС: CentOS 5.5 i386
ОЗУ на машине 256Мб, 2 процессора (вируалка)
может проблема в системе?
хм... если честно, то как бы надо весь код видеть... а вообще в какой то версии ядра был баг с не закрывающимися потоками. поток завершался, но при этом оставался висеть в состоянии ожидания в системе, чего с правами доступа... ну и конечно вопрос может быть в виртуалке, мало ли чего она там навиртуалила. попробуй взять другой дистриб, потом поменяй виртуалку, если не поможет клади весь код, будем разбираться.
Для тех кто будет искать подобное оставляю теги в сообщении:
освобождение памяти потока, принудительное освобождение памяти, освобождение ресурсов потока, pthread_detach()