2010-12-07 74 views
1

Voici le code:erreurs de codes thread-mutex C?

.... 
typedef struct { 
    int buf[10]; 
    long head, tail; 
    int full, empty; 
    pthread_mutex_t *mut; 
    pthread_cond_t *notFull, *notEmpty; 
} queue; 

int main(){ 
    queue *que; 
    pthread_t sup, cut; 
    que = queueInit(); 
    if(que == NULL){ 
    fprintf(stderr, "Queue Init failed"); 
    exit(1); 
    } 
    pthread_create(&sup, NULL, insertQueue, (void*) que); 
    pthread_create(&cut, NULL, insertQueue, (void*) que); 
    pthread_join(sup,NULL); 
    pthread_join(cut,NULL); 
    queueDelete(que); 
    return 0; 
} 

void *insertQueue(void *q) 
{ 
    queue *que; 
    int i; 
    que = (queue *)q; 
    for(i=0; i<20;i++){ 
    // Get mutex lock on the queue 
    pthread_mutex_lock(&mut); // Question (i) I guess this line is wrong 
    while(que>full){ 
     printf("Its full"); 
     // pthread wait condition for queue not full 
     pthread_cond_wait(&notFull, &mut); // Question (ii) 
    } 
    queueAdd(que,i); 
    // Unlock the queue 
    pthread_mutex_unlock(&mut); // Question (iii) 
    // Send signal saying there is data to be read 
    pthread_cond_signal(&notEmpty); // Question (iv) 
    usleeep(100000);) 
    return(NULL); 
    } 
} 

queue *queueInit(void){ 
    queue *q; 
    q = (queue *)malloc(sizeof(queue)); 
    if(q==NULL) return (NULL); 
    q->empty = 1; 
    q->full = 0; 
    q->head = 0; 
    q->tail = 0; 
    q->mut=(pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); 
    // Set default condition 
    pthread_mutex_init(&mut,NULL); // Question v 
    // Condition for not null 
    pthread_mutex_init(&notNull,NULL); // Question vi 
    // Condition for not empty 
    pthread_mutex_init(&notEmpty,NULL); // Question vi 
    return (q); 
} 
.... 

J'ai mis ma question au code, à savoir la question i - vi

Mon sentiment me dire, mes arguments sont faux, par exemple la question vi:

pthread_cond_init(notEmpty,NULL); 

il devrait être quelque chose d'autre, pas "(& notEmpty, Null)".

Aidez-nous s'il vous plaît.

+0

Deux variables de condition semblent moche et cela signifie généralement que ce n'est pas une solution idéale. Vous pouvez simplement avoir une seule variable de condition "queueChanged" ou quelque chose et signaler que la file d'attente gagne ou perd un élément. – AlastairG

Répondre

1

vous ne devriez pas utiliser & lorsque vous avez déjà un pointeur. Changer ceci:

// Set default condition 
    pthread_mutex_init(&mut,NULL); // Question v 
    // Condition for not null 
    pthread_mutex_init(&notNull,NULL); // Question vi 
    // Condition for not empty 
    pthread_mutex_init(&notEmpty,NULL); // Question vi 

à ceci:

// Set default condition 
    pthread_mutex_init(mut,NULL); // Question v 
    // Condition for not null 
    pthread_mutex_init(notNull,NULL); // Question vi 
    // Condition for not empty 
    pthread_mutex_init(notEmpty,NULL); // Question vi 

attention à & j'ai répudié. mut est déjà un pointeur, et faire &mut est une tentative pour obtenir le pointeur de pointeur vers pthread_mutex_t

+0

Merci. Que diriez-vous de la question i - iv? Une idée? – cecillia90

+0

vous devriez supprimer '&' là aussi. Dans tous les endroits. –

+0

bon père, merci =) – cecillia90

2

notNull est écrit comme notFull en deux endroits. notNull et notEmpty sont des variables de condition et non des mutex et doivent être initialisées en tant que telles. Aucune mémoire n'est allouée pour notNull et notEmpty.

Il peut être préférable de déclarer queue comme:

typedef struct { 
    int buf[10]; 
    long head, tail; 
    int full, empty; 
    pthread_mutex_t mut; 
    pthread_cond_t notFull; 
    pthread_cond_t notEmpty; 
} queue; 

Et puis garder tous les & caractères. Cela signifie que vous pouvez malloc le tout avec un seul appel. Je pense enfin que vous voulez dire while(que->full) pas while(que>full).