Pthread_create con più argomenti nella funzione iniziale

di il
5 risposte

Pthread_create con più argomenti nella funzione iniziale

Io dovrei passare al thread appena creato il puntatore ad una struttura.
Il problema è che non so bene come fare, cioè ho provato ma mi da errore di segmentazione.

// esercizi per provare a usare strutture
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
struct argThread{
	int indice;
	float **matrix;
	int dimensione;
	float *ptr;
};

typedef struct argThread argT;



float **allocaMatrix(int dim);
void *funct(void * );


int main(int argc,char *argv[]){
	argT *prova;
	float *array;
	int indice=1,dimensione=3;
	array=(float*)malloc(sizeof(float)*dimensione);
	float **matrice,*ptr;
	
	matrice=allocaMatrix(dimensione);
	prova=(argT*)malloc(sizeof(argT));
	prova->matrix=matrice;
	(prova->matrix)[0][0]=5;
	printf("elem matrice: %f \n",(prova->matrix)[0][0]);
	prova->indice=indice;
	printf("indice: %d \n",prova->indice);
	prova->dimensione=dimensione;
	printf("dimensione: %d \n",prova->dimensione);
	int i;
	for(i=0;i<dimensione;i++){
		array[i]=i+2;
	}
	prova->ptr=&array[0];
	printf("array: %f \n",*((prova->ptr)+2));

	//inizio thread
	pthread_t *tid;
	pthread_create(tid,NULL,funct,NULL);
}

float **allocaMatrix(int dim){
	float **matrix;
	int i,j;
	matrix=(float**)malloc(sizeof(float*)*dim);
	for (i=0;i<dim;i++){
		matrix[i]=(float*)malloc(sizeof(float)*dim);
		
	}
	for (i=0;i<dim;i++){
		for (j=0;j<dim;j++){
			matrix[i][j]=0;
		}
	}
	return matrix;
}

void *funct(void *){
	printf("ciao");
	
}

5 Risposte

  • Re: Pthread_create con più argomenti nella funzione iniziale

    Non si puo' fare.

    Ma dai, la soluzione e' banalissima: usi un puntatore!

    Ad una lista, un vettore, una mappa, oppure ad una classe custom
  • Re: Pthread_create con più argomenti nella funzione iniziale

    Passi per indirizzo la tua struttura alla thread_create. esso sarà il puntatore void della funzione.

    pthread_create( STRUCT_RITORNA_PID, ATTRIBUTE_OPTIONAL, INDIRIZZO FUNZIONE, PARAMETRO_FUNZIONE)

    pthread(&mypid,NULL, myfunc, &myparam);
  • Re: Pthread_create con più argomenti nella funzione iniziale

    Ho passato il puntatore come avete detto. Questo è il codice:
    
    // esercizi per provare a usare strutture
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <errno.h>
    struct argThread{
    	int indice;
    	float **matrix;
    	int dimensione;
    	float *ptr;
    };
    
    typedef struct argThread argT;
    
    
    
    float **allocaMatrix(int dim);
    void *funct(void *prova );
    
    
    int main(int argc,char *argv[]){
    	argT *prova;
    	float *array;
    	int indice=1,dimensione=3;
    	array=(float*)malloc(sizeof(float)*dimensione);
    	float **matrice,*ptr;
    	
    	matrice=allocaMatrix(dimensione);
    	prova=(argT*)malloc(sizeof(argT));
    	prova->matrix=matrice;
    	(prova->matrix)[0][0]=5;
    	printf("elem matrice: %f \n",(prova->matrix)[0][0]);
    	prova->indice=indice;
    	printf("indice: %d \n",prova->indice);
    	prova->dimensione=dimensione;
    	printf("dimensione: %d \n",prova->dimensione);
    	int i;
    	for(i=0;i<dimensione;i++){
    		array[i]=i+2;
    	}
    	prova->ptr=&array[0];
    	printf("array: %f \n",*((prova->ptr)+2));
    
    	//inizio thread
    	pthread_t tid;
    	void *status;
    	pthread_create(&tid,NULL,funct,&prova);
    	pthread_join(tid,status);
    	printf("elem matrice: %f \n",(prova->matrix)[0][0]);
    }
    
    float **allocaMatrix(int dim){
    	float **matrix;
    	int i,j;
    	matrix=(float**)malloc(sizeof(float*)*dim);
    	for (i=0;i<dim;i++){
    		matrix[i]=(float*)malloc(sizeof(float)*dim);
    		
    	}
    	for (i=0;i<dim;i++){
    		for (j=0;j<dim;j++){
    			matrix[i][j]=0;
    		}
    	}
    	return matrix;
    }
    
    void *funct(void *prova){
    	(prova->matrix)[0][0]=15;
    	printf("elem matrice: %f \n",(prova->matrix)[0][0]);
    }
    
    il problema è che non posso usare in questo modo gli attributi definiti nella struttura. Come fare?
    p.s.
    non ho capito se @migliorabile intendeva che non è possibile usare un puntatore alla struttura e bisogna quindi utilizzare altri metodi come liste ad esempio (vettori non credo si possa fare perchè sono tipi di dati diversi e sinceramente le mappe e le classi custom non le ho mai usate e non so neanche precisamente cosa siano).
  • Re: Pthread_create con più argomenti nella funzione iniziale

    Ciao, non ho letto tutto il codice, però nella funzione funct devi fare il cast verso il tipo corretto.
    Nel tuo caso direi
    argT *myarg = (argT *) prova;
    E dopo puoi accedere ai vari campi.
  • Re: Pthread_create con più argomenti nella funzione iniziale

    Grazie mille!

    metto la soluzione completa anche se a qualcuno interessasse:
    
    // esercizi per provare a usare strutture
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <errno.h>
    
    struct argThread{
    	int indice;
    	float **matrix;
    	int dimensione;
    	float *ptr;
    };
    
    typedef struct argThread argT;
    
    
    
    float **allocaMatrix(int dim);
    void *funct(void *prova );
    
    
    int main(int argc,char *argv[]){
    	argT *prova;
    	float *array;
    	int indice=1,dimensione=3;
    	array=(float*)malloc(sizeof(float)*dimensione);
    	float **matrice,*ptr;
    	
    	matrice=allocaMatrix(dimensione);
    	prova=(argT*)malloc(sizeof(argT));
    	prova->matrix=matrice;
    	(prova->matrix)[0][0]=5;
    	printf("elem matrice: %f \n",(prova->matrix)[0][0]);
    	prova->indice=indice;
    	printf("indice: %d \n",prova->indice);
    	prova->dimensione=dimensione;
    	printf("dimensione: %d \n",prova->dimensione);
    	int i;
    	for(i=0;i<dimensione;i++){
    		array[i]=i+2;
    	}
    	prova->ptr=&array[0];
    	printf("array: %f \n",*((prova->ptr)+2));
    
    	//inizio thread
    	pthread_t tid;
    	void *status;
    	printf("elem matrice: %f \n",(prova->matrix)[0][0]);
    	pthread_create(&tid,NULL,funct,&prova);
    	pthread_join(tid,(void*)&status);
    	printf("cifdgdsfg\n");	
    	exit(EXIT_SUCCESS);
    	
    }
    
    float **allocaMatrix(int dim){
    	float **matrix;
    	int i,j;
    	matrix=(float**)malloc(sizeof(float*)*dim);
    	for (i=0;i<dim;i++){
    		matrix[i]=(float*)malloc(sizeof(float)*dim);
    		
    	}
    	for (i=0;i<dim;i++){
    		for (j=0;j<dim;j++){
    			matrix[i][j]=0;
    		}
    	}
    	return matrix;
    }
    
    void *funct(void *prova){
    	argT *argv = (argT *) prova;
    	(argv->matrix)[0][0]=15;
    	argv->indice=5;
    	printf("indice: %d \n",(argv->indice));
    	*(argv->ptr)=5;
    	printf("elem array: %d \n",(argv->indice));
    	//printf("elem matrice: %f \n",(argv->matrix)[0][0]);
    	printf("ciao\n");
    }
    
Devi accedere o registrarti per scrivere nel forum
5 risposte