|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2007
Città: Terlago --> Trento
Messaggi: 88
|
[C] Pthread e mutex/condition
ciao a tutti.. allora, il programma funziona nel seguente modo:
partono 4 thread, 1 fa da client e manda richieste (mettendo tutto in una coda circolare) e sblocca un thread, in caso dovrebbe lasciare la richiesta in coda e un thread appena si libera la preleva. gli altri 3 threads invece prendono tali richiesta dalla coda e fanno delle cose: il problema è qui: Codice:
void put_richiesta(struct buffer *b) { struct element *x; int i=0; pthread_mutex_lock(&b->m); fprintf(stderr, "T bloccato\n"); b->blocked_readers++; pthread_cond_wait(&b->block_read, &b->m); fprintf(stderr, "T sbloccato........\n"); fprintf(stderr, "prima dell'estrazione "); print_CA(); if (extract_CA(x) == 1) { //fprintf(stderr, "1"); for (i=0; i<x->t; i++) { fprintf(stderr, "%s\n", x->msg); sleep(1); } //fprintf(stderr, "2"); pthread_mutex_unlock(&b->m); fprintf(stderr, "dopo l'estrazione ");print_CA(); } else { fprintf(stderr, "Non ci sono elementi in coda\n"); pthread_mutex_unlock(&b->m); } extract_CA(x); pthread_mutex_unlock(&b->m); } ![]() ![]() ![]() Grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Puoi postare la tua extract_CA? Credo ci sia un grossolano bug. Da come hai implementato il tutto sembra che in "x" ti aspetti il valore di ritorno, il che non può avvenire se non passi x per riferimento.
Inoltre hai una race condition sulla pthread_cond_wait; l'uso corretto di questa funzione è il seguente: Codice:
pthread_mutex_lock(&mtx); while (!the_condition_im_waiting_for()) pthread_cond_wait(&cond, &mtx); process_the_condition(); pthread_mutex_unlock(&mtx);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Oct 2007
Città: Terlago --> Trento
Messaggi: 88
|
Codice:
int extract_CA(struct element *x) { if(a.num == 0) return 0; *x = a.elements[a.tail]; a.tail = (a.tail + 1) % 5; a.num--; return 1; } Il problema non è che mi si blocca il programma, anche perchè per ora è in fase di realizzazione, il client mette in coda e fa una signal per il thread che si sblocca, e lo stiamo testando mettendo una richiesta per volta.... il codice che ho messo era commentato in parte e ho sbagliato a postare, le ultime due righe in realtà non ci sono... Queste qui in rosso: Codice:
else { fprintf(stderr, "Non ci sono elementi in coda\n"); pthread_mutex_unlock(&b->m); } extract_CA(x); pthread_mutex_unlock(&b->m); } |
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Dichiara: struct element x; e passa &x a extract_CA. Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Oct 2007
Città: Terlago --> Trento
Messaggi: 88
|
Vero... grazie adesso abbiamo risolto...........
Grazie mille, per un problema così stupido abbiamo perso quasi una giornata....... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:32.