[prog réseaux]serveur multithread et variable globales

serveur multithread et variable globales [prog réseaux] - C - Programmation

Marsh Posté le 24-02-2011 à 11:58:30    

Salut à tous,
 
Bonjour,
 
 
j'ai creer un serveur multithread en ecoute infini.A chaque nouvelle connextion il lance un nouveau thread dédié à un utilisateur :thread_user.
Voila la variable globale qui me pose probleme.

Code :
  1. //variable globale
  2. typedef struct info
  3. {
  4.     int socket;
  5.     char IP[15];
  6.     int port;
  7.    
  8.    
  9. } infos;


 
 
Donc en fait quand un utilisateur se connecte .Le serveur récupere son adresse ip et le port .Elle inscrit ces information avec la nouvelle socket creer dans la variable globale info.
Elle envoie le tout au thread nouvellement creer et se met immédiatement en reécoute d'une nouvelle connextion.Le thread récupere en local le contenu de la variable globale.
Le probleme est que si au meme moment un nouveau client se connecte pendant qu'un thread recupere en local les info de la variables,il risque d'y avoir des soucis pour le thread.
Donc comment protéger avec les mutex une variable globales?
Merci
 

Code :
  1. int main()
  2. {
  3. //mise en place socket
  4. //début de la boucle infini  
  5.     while(1)
  6.     {
  7.         evenement("attente d'une nouvelle connextion" );
  8.         /*acceptation des clients et creation d'une nouvelle socket client */
  9.         socket_client=accept(sock,(struct sockaddr *)&adresse_client,&taille);
  10.         /*test d'erreur de la fonction newsock*/
  11.         if(socket_client<0)
  12.         {
  13.             perror("erreur de la fonction accept" );
  14.             return 1;
  15.         }
  16. s
  17.         //acceuil d'un nouveau client
  18.         /*un nouveau utilisateur viens de se connexter .on collecte ses information
  19.          * de connextion :adresse IP,son port,la nouvelle socket(newsock)*/
  20.         infos info_client;
  21.         pthread_mutex_lock(&mutex);
  22.         strcpy(info_client.IP,inet_ntoa (adresse_client.sin_addr));
  23.         info_client.socket=socket_client;
  24.         info_client.port=ntohs(adresse_client.sin_port);
  25.      
  26.      
  27.         /*preparation des thread clients*/
  28.         pthread_mutex_unlock(&mutex);
  29.         pthread_attr_init(&attr);
  30.         pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  31.         pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);
  32.         /*lancement des thread proprement dit*/
  33.         if(pthread_create(&threadid,&attr,thread_user,(void *)&info_client)==0)
  34.         {
  35.             continue;
  36.         }
  37.         else
  38.         {
  39.             close(socket_client);
  40.         }
  41.     }
  42.   close(sock);
  43.     close(socket_client);
  44.     return 0;
  45. }
  46. //une partie du code de thread_user
  47. void* thread_user (void *info_client)
  48. {
  49.     int id_user;
  50.     char media[20];
  51.    
  52.     infos *infoclient=(infos *)info_client;
  53.  
  54.     /*on inscrit en local les information sur  l'utilisateur
  55.      * son adresse ip,la socket de communication,le port */
  56.     infos info_local;
  57.     info_local.socket=infoclient->socket;
  58.     strcpy(info_local.IP,infoclient->IP);
  59.    
  60.  
  61.     info_local.port=infoclient->port;
  62.     //reste  du code
  63. return NULL;
  64. }


 
 


Message édité par chetsam le 24-02-2011 à 12:01:19
Reply

Marsh Posté le 24-02-2011 à 11:58:30   

Reply

Marsh Posté le 09-03-2011 à 09:27:22    

Un simple semaphore devrait suffire non :??:
1- main() lance ton thread et attend (genre sem_wait)
2- thread_user récupère les infos, les copie et ensuite fait un sem_post.


---------------
iteme.free.fr | Mon feedback
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed