2013-02-01 3 views
0

J'écris une application réseau. et ont un problème concernant l'état de la course du filetage.programmation linux multithread, région de code atomique

"cd" est un descripteur de socket. l'un de mes thread récupère le descripteur de socket et envoie des données via le socket. Laisse dire que map_sd renvoie 5. Cependant un autre thread peut fermer le socket 5 et en affecter un autre. ce qui va détruire la logique du programme.

   // wait until there is valid descriptor mapping 
       while(!(cd = map_sd(sd))){ 
        sleep(1); 
       }     

       // forward PAYLOAD header 
       if(send(cd, &payload, sizeof(PAYLOAD), MSG_NOSIGNAL) < 0){  
        printf("send fail 813\n"); 
       } 

ce que je veux est de rendre le code ci-dessus « atomique » comment puis-je faire quand je suis en utilisant pthread dans linux bibliothèque ??

merci d'avance.

Répondre

0

Vous avez besoin d'une variable d'état et un mutex:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

Dans le passage du fil cd:

pthread_mutex_lock(&lock); 
/* here you pass cd through a data structure or whatever */ 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&lock); 

Dans le thread en attente de cd:

pthread_mutex_lock(&lock); 
if (pthread_cond_wait(&cond, &lock) != 0) { 
    /* handle error */ 
} 
/* here you can acquire cd */ 
pthread_mutex_unlock(&lock); 

Cela devrait être it - vous utilisez une variable de condition et un verrou pour un accès exclusif et notifiez l'autre thread qu'une ressource est maintenant un disponible. pthread_cond_wait() libère le verrou à attendre et le réacquire une fois qu'il a été notifié par l'autre thread avec pthread_cond_signal().

Édition: mise en forme.

+0

merci! C'est utile – daehee