Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6311
Последний выпуск: 19.06.2015

Linux потоки

1.2K
11 июля 2010 года
piroman17
175 / / 20.07.2006
Возникла проблема с памятью и потоками:
Есть сервер принимающий соединения - каждый клиент в отдельном потоке.
После ~500 соединений потоки перестают создаваться с perror "Cannot allocate memory"

Я вижу что дело в том что после выполнения работы потока за ним не освобождается память, т.к. когда я делаю тоже самое но в одном потоке (делаю сервер однопоточным) всё прекрасно.

я убрал из потока весь код кроме следующего, но память всё равно кончается:
 
Код:
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);
}


Подскажите как освободить память потока?
306
11 июля 2010 года
Artem_3A
863 / / 11.04.2008
ну лично я тут ни чего не вижу, покажи как создаешь потоки, как запускаешь и так далее.
1.2K
11 июля 2010 года
piroman17
175 / / 20.07.2006
Вод код создания потока:

 
Код:
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");                                                                                                      
}


clients[myclients].thread и clients[myclients].attr - динамические массивы, их размер контролируется с помощью функции die_client(conn.client) вызываемой в коде потока при его завершении.
по результатам тестов максимальный размер массива был равен 1, но сервер всё равно падает.
1.2K
11 июля 2010 года
piroman17
175 / / 20.07.2006
при этом размер программы в памяти равен 3107336 байт при выпадании ошибки.
Как то это странно....
ОС: CentOS 5.5 i386
ОЗУ на машине 256Мб, 2 процессора (вируалка)

может проблема в системе?
306
11 июля 2010 года
Artem_3A
863 / / 11.04.2008
хм... если честно, то как бы надо весь код видеть... а вообще в какой то версии ядра был баг с не закрывающимися потоками. поток завершался, но при этом оставался висеть в состоянии ожидания в системе, чего с правами доступа... ну и конечно вопрос может быть в виртуалке, мало ли чего она там навиртуалила. попробуй взять другой дистриб, потом поменяй виртуалку, если не поможет клади весь код, будем разбираться.
1.2K
11 июля 2010 года
piroman17
175 / / 20.07.2006
Вобщем всем спасибо! Действительно дело было в ядре, поборол с помощью pthread_detach().

Для тех кто будет искать подобное оставляю теги в сообщении:
освобождение памяти потока, принудительное освобождение памяти, освобождение ресурсов потока, pthread_detach()

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог