|
|||||||
|
|
|
![]() |
|
|
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: 04:43.




















