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!