Ciao ragazzi, sono nuovo del forum, perciò spero di aver postato adeguatamente e soprattutto di aver indovinato la sezione adatta. Sto iniziando a programmare con la libreria Pthreads e fino ai locks e le condition variables non ho avuto grandi problemi, adesso sto utilizzando i semafori ma sto incontrando un pò di difficolta.
Problema: Devo risolvere un problema in cui si ha una bacheca con degli annunci di appartamenti, ogni annuncio ha 3 strisce con i numeri da chiamare. Alla bacheca possono accedere N studenti e ogni studente può prendere 3 numeri diversi scelti a caso. Se riesce a prenderli tutti e 3 allora esce altrimenti aspetta un certo periodo di tempo e riprova di nuovo.
Risoluzione: X la risoluzione avevo pensato:
N threads = N studenti
F semafori binari = F annunci sulla bacheca
1) come posso generare 3 num causali che non siamo uguali da un array (di annunci)
Io avevo pensato a una cosa del genere, ma speravo di trovarne una migliore..
//selezione di 3 diversi appartamenti in modo casuale
for (i=0; i<3; i++)
{
indexSelected[i] = choice(numApartments);
if ( i == 1 )
{
//se la scelta è uguale a quella precedente, ripeti
while (indexSelected[i] == indexSelected[i-1])
indexSelected[i] = choice(numApartments);
}
if ( i == 2)
{
//se la scelta è uguale a una delle 2 precedenti, ripeti
while ((indexSelected[i] == indexSelected[i-1]) ||
(indexSelected[i] == indexSelected[i-2]))
indexSelected[i] = choice(numApartments);
}
printf ("STUDENT %d : Scelta n° %d Elemento selezionato di indice: %d \n", (int)arg, i, indexSelected[i]);
//in apartmSelected da 0 a 2 metto l'appartamento selezionato
apartmSelected[i] = arrayNoticesStudent[numStudent][indexSelected[i]];
}
2) Per quanto riguarda la mutua esclusione nell'accesso agli annunci avevo pensato a una soluzione del genere:
noticesTabs[di tutti gli appartamenti inizialmente] = 3;
//accede in mutua esclusione al primo notice e vede se ha un numero di tabs > 0
sem_wait(¬ices[apartmSelected[0]]);
if (noticesTabs[apartmSelected[0]] > 0)
{
printf(" +++ student %d tab num %d\n",numStudent, apartmSelected[0]);
noticesTabs[apartmSelected[0]]--;
sem_post(¬ices[apartmSelected[0]]);
numNoticesTaken ++;
}
else
{
sem_post(¬ices[apartmSelected[0]]);
}
Come posso pero' effettuare la sincronizzazione tra i vari studenti che mi permetta di evitare deadlock e permetta a tutti gli studenti di terminare la loro selezione....
Qualsiasi aiuto è ben accetto!!
Grazie, Luca.

Rispondi quotando