2011-10-15 2 views
0

J'essaie d'implémenter une file d'attente de blocage en utilisant des threads POSIX. Les segments de code importants sont indiqués ci-dessous. J'ai essayé d'exécuter ce programme. Le thread essayant de retirer un élément de la file s'endort quand il n'y a aucun élément dans la file d'attente et se réveille sans aucun signal du thread qui ajoute un élément dans la file d'attente (Ceci je conclus parce que je n'ai démarré aucun thread ajoute un élément dans la file d'attente). Le fil s'est réveillé à nouveau et ce processus se répète. Qu'est-ce que je fais mal? S'il vous plaît quelqu'un me dire ce que je manque ici?Mon thread Posix se réveille sans un signal

struct rqueue 
{ 
    int qsize; 
    int capacity; 
    pthread_mutex_t lock; 
    pthread_cond_t not_empty; 
    pthread_cond_t not_full; 
}; 

remove_element_method:

pthread_mutex_lock(&rq->lock); 

    while(rq->qsize == 0){ 
     perror("Q size is zero going to sleep"); 
     pthread_cond_wait(&rq->not_empty); 
     perror("woke up"); 
    } 

// some code 
    pthread_cond_signal(&rq->not_full); 
    pthread_mutex_unlock(&rq->lock); 

add_element_method:

pthread_mutex_lock(&rq->lock); 

    if(rq->capacity != -1){ 

     while(rq->qsize == rq->capacity){ 
     pthread_cond_wait(&rq->not_full); 
     } 
    } 

    //some code 

    pthread_cond_signal(&rq->not_empty); 
    pthread_mutex_unlock(&rq->lock); 

Répondre

0

pthread_cond_wait() prend deux arguments - le second est le mutex que vous tenez. Vous ne faites que passer un argument.

Avez-vous également initialisé les variables mutex et condition en utilisant pthread_mutex_init() et pthread_cond_init()?

+1

De plus, à quelle fréquence cela se produit-il? Si c'est rare, c'est normal - ce pourrait être [réveil parasite] (http://en.wikipedia.org/wiki/Spurious_wakeup). – uscjeremy

+0

Merci beaucoup. J'ai oublié le deuxième argument. Cela semble fonctionner maintenant. Mais le compilateur devrait dire qu'il n'y a pas de fonction correspondante à droite? – FourOfAKind

+1

Si le compilateur a accepté votre code avec un argument manquant, cela signifie presque sûrement (1) que vous avez oublié d'inclure 'pthread.h', et (2) que tous les avertissements sont désactivés. –

Questions connexes