Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854

    [C] Errore sconosciuto: *** glibc detected ***

    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!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    FILE *fp; dev'essere locale alle funzioni, altrimenti hai una race condition.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.