bonjour,
Voila j'ai programme un petit serveur en C qui utilise les pthread.
Les thread sont creer a chaque connexion d'un client.
je met les pthread en detached pour qu'à la fin du thread, celui ci libere la memoire. Pour tant je vois que mon processus serveur prend tjs de la mémoire.
Bref voici un bout de code qui sera plus parlant
pthread_attr_setdetachstate (&thread_attr,PTHREAD_CREATE_DETACHED);
while(1)
{
.
.
if((sock_client=accept(sockfd,(struct sockaddr*)&sockadr_client,&client_length))<1)
{
.
.
}
else
{
.
.
pthread_create(&client_thread_create, &thread_attr, Thread_client, (void *)&sock_client);
}
}
ma focntion de thread :
void *Thread_client (void *new_sock)
{
int num_s = *(int*)new_sock;
pthread_t id_thread;
char toto[5000000];
memset((char *) &toto,55,5000000);
pthread_mutex_lock(&mutex); // debut de la section critique
close(num_s);
nb_clients--;
pthread_mutex_unlock(&mutex); // fin de la section critique
pthread_exit(NULL);
}
j'ai mis un tableau de 5000000 pour que l'appli prenne 5 MO de memoire ce qui fait 1% de ma memoire.
A chaque client qui se connect j'ai 1% de ma memoire qui est prise est qui n'est jamais libéré :((
Si qelqu'un pouvais me dire pourquoi ma memoire ne se libere pas alors que j'ai creer les thread en detached :(
# buffer
Posté par nanard . Évalué à -2.
Je pense que si tu change
> char toto[5000000];
par un pointeur auquel tu alloue la taille voulue de memoire
il n'y auras plus qu'a libere la memoire a la fin du thread
Allez tous vous faire spéculer.
# Ne pas confondre
Posté par Jerome Herman . Évalué à 4.
En créant un thread tu prend de la mémoire. Les structures et les fonctions du threads lui sont propres et elles seront nettoyées lors de la destruction du thread.
Mais même si tu créé tes threads en mode detached, la mémoire est toujours allouées par le process. Vis à vis du kernel c'est le process qui a réclamé de la mémoire, et comme le process tourne toujours, la mémoire n'est pas libérable automatiquement.
Rien à voir mais je le dis quand même :
Ne connaissant pas les libs que tu utilises et la fonctionnalité de ton programme je m'abstiendrais de juger hativement, mais tu es sur pour les casts en pagaille ?
[^] # Re: Ne pas confondre
Posté par Ph Husson (site web personnel) . Évalué à 2.
[^] # Re: Ne pas confondre
Posté par golgot . Évalué à 1.
En fait j'ai aussi essaye a la place de (char toto[5000000];) de mettre char *toto = (char *)malloc(5000000); et a la fin du thread juste avant (pthread_exit(NULL);) j'ai mis free(toto);
mais la memoire ne se libere pas.
Alors si c le process qui a reclamé la memoire, comment faire pour liberer cette memoire qui me pose vraiment du soucis :((
Merci encore de votre aide ;)
[^] # Re: Ne pas confondre
Posté par Krunch (site web personnel) . Évalué à 3.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Ne pas confondre
Posté par ecyrbe . Évalué à 1.
Si jamais un autre process à desoin de mémoire et qu'il n'en reste plus, normalement la procédure de swaping (page fault) va se rendre compte que ton programme ne l'utilise plus et va la redonner au programme qui en a besoin, pour éviter de faire un vrai swaping...
en gros tu peux considérer que ton programme se voit allouer plein de mémoire, mais ce n'est que virtuel...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.