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

    C:

    Ragazzi,
    ho realizzato il seguente programma:

    ----
    Implementare 3 thread lettori, 2 thread scrittori che agiscono su un file condiviso. Gli elementi scritti/letti sono costituiti da:
    - TID dello scrittore
    - numero progressivo di scrittura autonomo per ogni scrittore

    Si hanno le seguenti specifiche:
    - le attività di srittura indipendenti (fuori dalla sezione critica) devono durare 1 sec;
    - le attività di lettura indipendenti (fuori dalla sezione critica) dureranno 2 sec. Viene letto un elemento alla volta.
    - ogni volta che uno scrittore si accorge di aver scritto 10 elementi, cancella metà degli elementi presenti sul file.

    Stampare:
    - le attività indipendenti di creazione dell'elemento da parte dellos scrittore;
    - attività di lettura indipendente da parte del lettore, che consiste nlla stampa a video di identificatore dl lettore e dei campi dell'elemento letto. */
    ----


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <semaphore.h>
    
    #define NL 3
    #define NS 2
    
    pthread_mutex_t mutex;		
    pthread_mutex_t mutex_scrittore;	//mutex che sblocca lo scrittore
    
    int num_lettori;	//variabile che conta i lettori
    
    //STRUTTURA
    typedef struct{
    	int TID;
    	int cont;
    } elemento;
    
    FILE *file_lettori;
    FILE *file_scrittore;
    
    int contatore;
    int cont;
    
    //SCRITTORE:
    void *scrittore (int i){
    	elemento elem;
    	pthread_t TID;
    	
    	TID = pthread_self ();
    
    	while (1){
    		pthread_mutex_lock (&mutex_scrittore);
    		elem.TID = TID;
    		elem.cont = cont;
    		fwrite (&elem, sizeof (elemento), 1, file_scrittore);
    		printf ("%d", elem.cont);
    		pthread_mutex_unlock (&mutex_scrittore);
    	}
    }
    
    //LETTORE:
    void *lettore (int i){
    	elemento elem;
    
    	while (1){
    		pthread_mutex_lock (&mutex);
    		num_lettori ++;
    
    		if (num_lettori == 1)
    			pthread_mutex_lock (&mutex_scrittore);
    		fread (&elem, sizeof (elemento), 1, file_lettori);
    		printf ("%d", elem.cont);
    		pthread_mutex_lock (&mutex);
    		num_lettori --;
    
    		if (num_lettori == 0)
    			pthread_mutex_unlock (&mutex_scrittore);
    		pthread_mutex_unlock (&mutex);
    		}
    	sleep (3);
    }
    
    int main ()
    {
    	pthread_t lett[NL];
    	pthread_t scritt[NS];
    
    	int i;
    
    	pthread_mutex_init (&mutex , NULL);
    	pthread_mutex_init (&mutex_scrittore, NULL);
    
    	num_lettori = 0;
    
    	for (i=0; i<NS; i++)
    		pthread_create (&scritt[i], NULL, (void *) scrittore, (void*) i);
    
    	for (i=0; i<NL; i++)
    		pthread_create (&lett[i], NULL, (void *) lettore, (void*) i);
    
    	pthread_exit (NULL);
    }
    Al momento dell'esecuzione mi da errore di Segmentation Fault...come mai? Grazie!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Intanto, correggi il titolo ...

    E poi, quando ti da' l'errore? Subito? Non appare nulla a video?

    Non avevi già un thread sull'argomento? Perchè non usare quello?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Scusami per il titolo, dovevo aggiungerlo e l'ho dimenticato...

    I due thread trattano argomenti diversi, per questo ne ho creati due!

    L'errore di Segmantation Fault viene dato subito, appena lo eseguo!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il programma esegue la fwrite e la fread utilizzando due puntatori

    FILE *

    mai inizializzati!

    Se lo fai nel main, mostralo ... altrimenti non si capisce molto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Forse il problema sta proprio qui, quello è tutto il mio programma, non c'è altro!!!

    Le inizializzo direttamente nel main?

    Come?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Felino
    Forse il problema sta proprio qui, quello è tutto il mio programma, non c'è altro!!!

    Le inizializzo direttamente nel main?

    Come?
    Che vuol dire "come"? Hai utilizzato thread e mutex e non sai aprire un file ?

    Utilizzi la fopen, no ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Se inserisco queste due funzioni...?!?

    codice:
    void scrivisufile(FILE * fw , data_t * data){
                        pthread_mutex_lock(&mutex);
                        
                        
                        fwrite((void*)data,sizeof(data_t),1,fw);
                        fflush(fw);
    
                        pthread_mutex_unlock(&mutex);
    }
    
    void leggidafile(FILE * fr , data_t * readata){
                        
     
                        pthread_mutex_lock(&mutex);
                        
                        
                        fread((void*)readata,sizeof(data_t),1,fr);
                        fflush(fr);
     
                        pthread_mutex_unlock(&mutex);
    }

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Felino
    Se inserisco queste due funzioni...?!?
    Cosa c'entra con quello che ti ho detto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Dai, dammi una mano se puoi...

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ti ho già detto !

    Devi usare due fopen per inizializzare i due puntatori e aprire i file da cui leggerai (che deve esistere ovviamente) e in cui scriverai ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.