PDA

Visualizza la versione completa : [C] Errore sconosciuto: *** glibc detected ***


Felino
05-06-2010, 16:20
Ragazzi, ho creato il seguente programma, ma al momento della compilazione mi da errore:


/*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!

shodan
05-06-2010, 17:16
FILE *fp; dev'essere locale alle funzioni, altrimenti hai una race condition.

Loading