2010-03-29 9 views
2

J'ai une structure de file d'attente qui est utilisée par plusieurs pthreads. Les threads sont supposés déquiler de la file d'attente si ce n'est pas vide et ensuite faire leur affaire. Je l'ai initialement configuré comme une boucle while où les threads ont vérifié si la file d'attente était vide en utilisant un mutex_lock. Malheureusement, cela a ralenti mon programme jusqu'à un crawl.Problème avec les sémaphores et sem_wait()

J'ai essayé d'implémenter un sémaphore comme la variable "count" de ma file d'attente, mais malheureusement, je cours dans un segfault quand j'essaie d'appeler sem_wait(). J'ai trouvé le gdb et le semaphore.h ne jouent pas bien ensemble, donc je suis vraiment perdu. Je fais peut-être une erreur de novice, alors toute aide ou suggestion serait appréciée.

structure de file d'attente:

typedef struct { 
    int q[QUEUESIZE+1]; 
    int first; 
    int last; 
    sem_t count; 
} queue; 

Voici l'initialisation de celui-ci:

queue *CreateQueue(void) 
{ 
    queue *q; 
    q = (queue*)malloc(sizeof(queue)); 
    if (q == NULL) 
    return NULL; 
    q->first = 0; 
    q->last = 0; 
    sem_init(&(q->count),0, 0); 

} 

Et je fais en sorte que j'appelle:

queue *q; 
    q = CreateQueue(); 

avant que les discussions sont créés.

Voici l'appel que les défauts SEG

void *ThreadWait(void *t) { 
    while(1) { 
    sem_wait(&(q->count)); //THIS SEGFAULTS 
    ThreadFun(); //this is the function the thread would go to to do all the work 
    } 
} 

J'espère que c'est juste une simple erreur de ma part que je ne vois pas en ce moment.

Merci d'avance.

EDIT: pour ajouter un code clarifiant

+0

Pouvez-vous poster un code un peu plus complet. Ce n'est pas clair si vous init et attendez sur le même sem_t. Aussi avez-vous un fichier core? Empiler des traces? –

+0

@Nikolai Merci, j'ai ajouté plus de code, je n'ai pas de fichier core ou trace de pile. Est-il possible d'attraper une trace de pile sans gdb? – Evan

+0

Une autre ambiguïté dans votre exemple de code est la variable 'q' dans' ThreadWait() '. Est-ce une variable globale? Le problème pourrait-il être un souvenir de plus de mémoire? Aussi, utilisez-vous fork() ou pthreads? – atlpeg

Répondre

3

Si CreateQueue dans l'exemple ci-dessus est terminée, il ne semble pas définir votre variable globale q. Il affecte les résultats à une variable locale. Mais il ne semble pas retourner la variable.

+1

Vous êtes un faiseur de miracles. Je viens de remarquer qu'il n'a pas retourné de valeur. Une autre raison de compiler avec -Wall. Merci! – Evan

+0

+1 bonne prise, vérifiez toujours les bases en premier :) –

Questions connexes