Esercizio base sui thread

di il
3 risposte

Esercizio base sui thread

Salve ragazzi:
devo creare un programma che legga 10 nomi da un file di lunghezza massima 20 caratteri
e x ogni nome letto il main deve creare immettere un identificativo del thread (numero che corrisponde alla i del ciclo for) il nome letto e un numero generato a random (compreso da 1 alla lunghezza del nome letto) dopo di che si crea un thread (uno x ogni nome) a cui gli viene passato il vettore appena creato, il thread legge il nome del vettore e legge il numero generato e va ad immettere un X nella posizone generata all interno del nome non so se mi sono spiegato bene ora posto il codice e vi espongo il mio problema:
#include "lib2.h"

 struct v  {
	int nThreah;
	 char nome[20];
	int posModifica;
}nomi;

void* modificaNome(void* pt){
	v* argPt;
	v arg;
	 argPt=(v*)pt;
	 arg=*argPt;
	 cout << "My tID: " << pthread_self() << " My ID: " << arg.nThreah << endl;
	 cout << "Nome da modificare: " << arg.nome << " posizione da modificare: " << arg.posModifica << endl;
	 int aus=arg.posModifica;
	 arg.nome[aus]='X';
	 sleep(3);
	 //restituzione ris
	 v* risPt=(v*)malloc(sizeof(v*));
	 *risPt=arg;
	 return (void*) risPt;

}

int main() {
	pthread_t tID[10];
	FILE* fp=fopen("nomi","r");
	int i,nok;
	for(i=0;i<10;i++){
		//leggo nome dal file
		fgets(nomi.nome,20,fp);
		nomi.nThreah=i;
		nomi.posModifica=genera(0,strlen(nomi.nome));
		nok=pthread_create(&tID[i],NULL,modificaNome,(void*)&nomi);
		if(nok) esci("Errore creazione thread");
		sleep(1);
	}
	 cout << "Sono il main e aspetto la terminazione dei thraed" << endl;
	v* risPt;
	 	for(i=0;i<10;i++){
	 		nok=pthread_join(tID[i],(void**)&risPt);
	 		if(nok) esci("Errore terminazione thread");
	 		cout << "sono il thread  ID" << *risPt.nome << endl; //Questa RIGA DA ERRORE!!!
	 	}
	fclose(fp);
	return 0;
}
IL problema è che dopo che la funzione restituisce il vettore del nome modificato ma nn capito xke qll riga va in errore gentilmente se mi trovate l'errore mi potete spiegare ache il perchè?
grazie in anticipo!

3 Risposte

  • Re: Esercizio base sui thread

    Premetto che sono un po' a digiuno sui threads... (nel senso che utilizzo di più i socket) comunque da quello che mi ricordo c'è una parte interessante riguardo la semaforizzazione dell'area sharata usando mutex.

    Ho dato un'occhiata al tuo src, senza compilarlo (non ho lib2.h). In linea di massima il giro mi sembra corretto a parte un errore: modificaNome dovrebbe allocare l'intera struttura e non solo in ptr. Io farei subito una copia dell'area di memoria, in maniera da evitare possibili variazioni sulla zona sharata (andrebbe lockata), poi visualizzo e modifico il nome ed infine rilascio il nuovo ptr.
    
    void* modificaNome(void* pt)
    {
      v* arg=(struct v *) malloc (sizeof(v));
      memcpy (arg,pt,sizeof(v));
      
      cout << "My tID: " << pthread_self() << " My ID: " << arg->nThreah << endl;
      cout << "Nome da modificare: " << arg->nome << " posizione da modificare: " << arg->posModifica << endl<<endl;
      
      arg->nome[arg->posModifica]='X';
      
      return ((void *) arg);
    }
    
    Poi nel main, il giro della create mi sembra corretto... la dicharazione di risPt è giusta ed anche la pthread_join.
    Per la visualizzazione usa 'risPt->nome' (già puntatore) ed infine aggiungi free (risPt);
    
      v *risPt;
      for(i=0;i<10;i++)
      {
        nok=pthread_join(tID[i],(void **) &risPt);
        if(nok) esci("Errore terminazione thread");
              cout << "sono il thread  ID" << risPt->nome << endl; //Questa RIGA DA ERRORE!!!
              free (risPt);
      }
    
    Saluti,
    Max
  • Re: Esercizio base sui thread

    Grazie mille finalmente riuscirò a far andare sto cavolo di compito ^^ era tutto il pomeriggio che schizzavo e nn capivo avrò letto 10 vote il manuale di c ma nn trovavo l'errore thk!!!ora lo metto aposto =)
  • Re: Esercizio base sui thread

    Figurati...
Devi accedere o registrarti per scrivere nel forum
3 risposte