Pthread_create con più argomenti nella funzione iniziale

di Anonimizzato14574 il
5 risposte
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

  • 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
  • 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);
  • 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).
  • 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.
  • 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