Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] problema con passaggio parametri a funzione eseguita da thread

    Salve a tutti,

    ho questo semplice codice che richiama un thread che dovrebbe stampare due valori contenuti nella struct che prende come parametro, ma stampa due valori a caso. Non capisco perché.

    Qualcuno saprebbe aiutarmi?

    codice:
    #include <unistd.h>
    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    typedef struct{
    	int a;
    	int b;
    } int_struct;
    
    int status;
    
    void *test_thread(int_struct param)
    {
    	printf("Thread active\n");
    	printf("Value a: %d\n",param.a);
    	printf("Value b: %d\n",param.b);
    	pthread_exit((void *)&status);
    }
    
    int main (int argc, char *argv[])
    {
    	int i;
    	pthread_t tid;
    	void *status;
    	int_struct *param;
    	param = malloc(sizeof(int_struct));
    	param->a = 2;
    	param->b = 3;
    
    	i=pthread_create(&tid, NULL, test_thread, &param);
    	if (i) {
    	  printf("cannot create thread for error %d\n", i);
    	  exit(-1);
    	}
    
    	pthread_join(tid, &status);
    
    	return 0;
    }
    Ah, ovviamente ho provato anche il seguente codice:
    codice:
    void *test_thread(void *param)
    {
    	printf("Thread active\n");
    	printf("Value a: %d\n",param->a);
    	printf("Value b: %d\n",param->b);
    	pthread_exit((void *)&status);
    }
    Ma anche con void *param, come parametro non c'è verso di farlo funzionare. Come si passano più parametri ad un thread?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Usando una struct ovviamente. Solo che sbagli come passarla.
    La pthrerad_create riceve un puntatore void* che poi passa come argomento alla funzione callback.
    Invece tu passi il puntatore al puntatore:
    codice:
    	param = malloc(sizeof(int_struct));
    	param->a = 2;
    	param->b = 3;
    
    	/* i=pthread_create(&tid, NULL, test_thread, &param); */
    	i=pthread_create(&tid, NULL, test_thread, param); /* non &param */
    e la funzione callback deve preoccuparsi di castare al puntatore corretto.
    codice:
    void *test_thread(void *param)
    {
            int_struct *prm = (int_struct*) param;
    	printf("Thread active\n");
    	printf("Value a: %d\n",prm ->a);
    	printf("Value b: %d\n",prm ->b);
    	pthread_exit((void *)&status);
    }
    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.

  3. #3
    Porca miseria! Grazie! Grazie veramente di cuore, stavo uscendo pazzo.
    Funziona perfettamente.

    Ecco quindi il codice completo:
    codice:
    #include <unistd.h>
    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    typedef struct{
    	int a;
    	int b;
    } int_struct;
    
    int status;
    
    void *test_thread(void *param)
    {
    	int_struct *prm = (int_struct*)param;
    	printf("Thread active\n");
    	printf("Value a: %d\n",prm->a);
    	printf("Value b: %d\n",prm->b);
    	pthread_exit((void *)&status);
    }
    
    int main (int argc, char *argv[])
    {
    	int i;
    	pthread_t tid;
    	void *status;
    	int_struct *param;
    	param = malloc(sizeof(int_struct));
    	param->a = 2;
    	param->b = 3;
    
    	i=pthread_create(&tid, NULL, test_thread, param);
    	if (i) {
    	  printf("cannot create thread for error %d\n", i);
    	  exit(-1);
    	}
    
    	pthread_join(tid, &status);
    
    	return 0;
    }
    In realtà in uno dei miei tentativi c'ero pure andato vicino, ma sbagliavo nel fare:
    int_struct prm = (int_struct*)param;
    invece che
    int_struct *prm = (int_struct*)param;

    Ancora grazie.

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.