Newsgroup: it.comp.os.linux.development
Titolo: Semafori

 
          Buongiorno a tutti.
ecco la mia situazione: ho un array di questa struttra in memoria condivisa
. In ogni posizione dell'array ho 3 semafori che regolano l'accesso al
buffer sndbuff, secondo la politica produttore/consumatore
struct info_client {
    int disponibile; /* se 0 allora dispobile, 1 occupato */
    char sndbuff[NBUFF][MAXLINE]; /* coda di messaggi da inviare a id-client */
 
    sem_t *mutex,*nvuoti,*nscritti; /*puntatori a semafori*/
 
     int libero, preleva;/*testa e coda sndbuff per inserire e prelevare
messaggi*/
    char srv_snd_mutex_n[MAXSTRING], srv_snd_nscritti_n[MAXSTRING],
srv_snd_nvuoti_n[MAXSTRING]; /* nomi semafori */
} info_client;
come mai eseguendo il codice sottoriportato, la funzione
sem_wait(clients[i].nvuoti) (e sem_post(clients[i].nscritti) mi incrementano
i volte sempre lo stesso semaforo, anzichč incrementare 1 i diversi semafori
che si trovano in clients[i] dove la i č sempre diversa?
Esiste un ciclo for i=0..MAXCONN che crea MAXCONN thread che eseguono questa
opeazione. ovviamente ogni thread ha una "i" diversa
/*i semafori nvuoti sono inizializzati tutti a 16, gli nscritti tutti a 0. I
nomi deii semafori sono tutti diversi del tipo nvuoti_i e nscritti_i dove i
varia in 0..MAXCONN*/
/*ipottizziamo esecuzione 2 thread e che clients[i].disponibile sia = 1
sempre*/
if(clients[i].disponibile == 1) {
 
         /* ottieni valore semaforo i-esimo */
         sem_getvalue(clients[i].nvuoti, &val);
 
         /* stampa valore appena ottenunto */
         printf("(%d)elabora: clients[%d].vuoti=%d\n",id,i,val);
         /* T1-> stampa ....clients[0].nvuoti=16 */
         /* T2 che stampa dopo tutte le stampe di T1 -> stampa ...clients[1].nvuoti=1
          * ovviamente vi rendete conto che sem_getvalue(clients[1].nvuoti) non
ritorna il valore corretto del
          * semaforo in quanto ancora nessuna sem_wait č stata chiamata sul semaforo
clients[1].nvuoti */
         /* wait su nvuoti... ci si aspetta che clients[0].nvuoti = 15; e
clients[1].nvuoti=15
         if(sem_wait(clients[i].nvuoti) == -1) perror("sem_wait"),exit(1);
         /* stampa del valore dell'iesimo semaforo dopo la wait */
          sem_getvalue(clients[i].nvuoti, &val);
          printf("(%d)elabora: clients[%d].nvuoti=%d\n",id,i,val);
         /* T1-> stampa ....clients[0].nvuoti=15 */
         /* T2 che stampa dopo tutte le stampe T1 -> stampa ...clients[1].nvuoti=14
(avendo chiamato una sola wait sul semaforo in questione*/
 
         /* IL PROGRAMMA CONTINUA CON L'ACCESSO ALLA SEZIONE CRITICA IN MUTA EX*/
          if(sem_wait(clients[i].mutex) == -1) perror("sem_wait"),exit(1);
         /* SEZIONE CRITICA */
         /*COPIA IN MEMORIA CONDIVISA CLIENTS[i] NELL'ARRAY SNDBUFF IN POSIZIONE
CLIENTS[i].libero */
	 strcpy(clients[i].sndbuff[clients[i].libero],testo);
         /* CAMBIA LA PROSSIMA POSIZIONE LIBERA */
          clients[i].libero = (clients[i].libero+1)%NBUFF;
         /* FINE SEZIONE CRITICA */
 
          /* QUI HO LO STESSO PROBLEMA CHE C'E' CON CLIENTS[i].NVUOTI solo che siccome
questi sono
           * post sul semaforo clients[i].nscritti dopo il post
           * T1-> stampa ...clients[0].nscritti=1;
           * T2-> stampa.. clients[1].nscirtti=2 (anzichč 1) */
          sem_getvalue(clients[i].nscritti, &val);
          printf("(%d)elabora:
clients[%d].nscritti(%s)=%d\n",id,i,clients[i].srv_snd_nscritti_n,val);
          if(sem_post(clients[i].nscritti) == -1) perror("sem_post"),exit(1);
          sem_getvalue(clients[i].nscritti, &val);
          printf("(%d)elabora:
clients[%d].nscritti(%s)=%d\n",id,i,clients[i].srv_snd_nscritti_n,val);
 
          if(sem_post(clients[i].mutex) == -1) perror("sem_post"),exit(1);
       }
Spero di essere stato abbastanza chiaro.
se potreste aiutarmi a capire l'errore ve ne sarei molto grato.
Saluti
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Ho provato a fare ulteriori test... pensando ci fosse qualcosa di anomalo
nella crezione dei semafori
    if( (clients[id].nscritti = sem_open(clients[id].srv_snd_nscritti_n ,
O_CREAT | O_EXCL, 0644, 0))== SEM_FAILED )
        perror("sem_open srv_nscritti"),exit(1);
    sem_getvalue(clients[id].nscritti,&val);
    printf("%x %x clients[id].nscirtti
val=%d\n",&clients[id].nscritti,clients[id].nscritti,val);
per id = 0 stampa
    4004e018 40021000 clients[o].nscritti val=0
per id = 1 stampa
   4005209c 40021000 clients[1].nscritti val=0
deduco che i semafori vengono creati ad indirizzi diversi
(clients[id].nscritti), ma che puntano allo stesso semaforo
all'indirizzo(40021000)
o sbaglio?
