Ragazzi, ho creato il seguente programma, ma al momento della compilazione mi da errore:
codice:/*implementare 3 thread lettori 2 scrittori ke agiscono su un file condiviso. gli elementi scritti /letti sono composti da tid dello scrittore numero progressivo di scrittura autonomo per ogni scrittore si hanno le seguenti specifiche le attività di scrittura indipendenti(fuori dalla sezione critica)devono durare 1 sec le attività di lettura indipendente(fuori dalla sezione critica) devono durare 2 secondi.viene letto un elemento alla volta ogni volta ke uno scrittore si accorge di aver scritto 10 elementi cancella metà degli elementi presenti sul file stampare: attività indipendente di creazione dell'elemento da parte dello scrittore attività di lettura indipendente da parte del lettore, che consiste nella stampa a video di identificatore del lettore e dei campi dell'elemento letto */ #include<pthread.h> #include<semaphore.h> #include<stdlib.h> #include<stdio.h> #define ns 2 #define nl 3 typedef struct { pthread_t tid; //Thread id dello scrittore int num; //Numero progressivo di scrittura autonomo per ogni scrittore }elemento; pthread_mutex_t data, mutex,let; elemento el; FILE *fp; int nreaders=0; void *scrittore(void *x) { int i=(int)x; int num=1; elemento app; while(1) { pthread_mutex_lock(&data); if((fp=fopen("20-05-09-2.txt","a"))==NULL){perror("errore apertura file\n"); exit(0); } app.tid=pthread_self(); app.num=num; fprintf(fp,"%d%d\n", app.tid,app.num); printf("sono lo scrittore %d e ho inserito nel file tid=%d,\t numero=%d\n", app.tid,app.num); fclose(fp); pthread_mutex_unlock(&data); sleep(1); } } void *lettore(void *x) { int i=(int)x; elemento app; while(1) { pthread_mutex_lock(&mutex); if(++nreaders==1){ pthread_mutex_lock(&data); } pthread_mutex_unlock(&mutex); if((fp=fopen("20-05-09-2.txt","r"))==NULL){perror("errore apertura file\n"); exit(0); } while((fscanf(fp,"%d%d",&app.tid,&app.num))!=EOF) printf("sono il lettore %d e ho letto num thread %d valore %d\n",i,app.tid,app.num); fclose(fp); pthread_mutex_lock(&mutex); if(--nreaders==0){ pthread_mutex_unlock(&data); } pthread_mutex_unlock(&mutex); sleep(2); } } int main() { pthread_t lettori[nl],scrittori[ns]; pthread_mutex_init(&let,NULL); pthread_mutex_init(&data,NULL); pthread_mutex_init(&mutex,NULL); int i; for(i=0;i<ns;i++){ pthread_create(&scrittori[i],NULL,&scrittore,(void*)i); } for(i=0;i<nl;i++){ pthread_create(&lettori[i],NULL,&lettore,(void*)i); } for(i=0;i<ns;i++){ pthread_join(scrittori[i],NULL); } for(i=0;i<nl;i++){ pthread_join(lettori[i],NULL); } }
ERRORE:
*** glibc detected *** ./20_2: double free or corruption (top): 0x0848f5a8 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x17b591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x17cde8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x17fecd]
/lib/tls/i686/cmov/libc.so.6(fclose+0x14a)[0x16baaa]
./20_2[0x8048958]
/lib/tls/i686/cmov/libpthread.so.0(+0x596e)[0x91096e]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0x1dda4e]
======= Memory map: ========
00110000-00263000 r-xp 00000000 08:04 655291 /lib/tls/i686/cmov/libc-2.11.1.so
00263000-00264000 ---p 00153000 08:04 655291 /lib/tls/i686/cmov/libc-2.11.1.so
00264000-00266000 r--p 00153000 08:04 655291 /lib/tls/i686/cmov/libc-2.11.1.so
00266000-00267000 rw-p 00155000 08:04 655291 /lib/tls/i686/cmov/libc-2.11.1.
continua....
Qualcuno saprebbe dirmi il perchè?
Grazie!


Rispondi quotando