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!