Cast tra void* ed altri tipi

di il
2 risposte

Cast tra void* ed altri tipi

Ciao a tutti.
Avrei un dubbio riguardo il codice seguente, molto semplice, che consiste nel create dei threads per fargli eseguire una funzione.

#include <pthread.h>
 #include <stdio.h>
 #define NUM_THREADS     5

 void *PrintHello(void *threadid)
 {
    long tid;
    tid = (long)threadid;
    printf("Hello World! It's me, thread #%ld!\n", tid);
    pthread_exit(NULL);
 }

 int main (int argc, char *argv[])
 {
    pthread_t threads[NUM_THREADS];
    int rc;
    long t;
    for(t=0; t<NUM_THREADS; t++){
       printf("In main: creating thread %ld\n", t);
       rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
       if (rc){
          printf("ERROR; return code from pthread_create() is %d\n", rc);
          exit(-1);
       }
    }

    /* Last thing that main() should do */
    pthread_exit(NULL);
 }
Codice preso da qui: https://computing.llnl.gov/tutorials/pthreads/samples/hello.c

La mia domanda è la seguente: perchè, nella funzione pthread_create(), come ultimo argomento posso passare direttamente la variabile t anzichè passare &t? Dato che il prototipo della funzione si aspetta un puntatore, dunque un indirizzo...

2 Risposte

  • Re: Cast tra void* ed altri tipi

    Non ho la più pallida idea di cosa faccia la funzione pthread_create ma passargli l'indirizzo della variabile t, che è la variabile di controllo del ciclo, ha senso solo se
    - non la modifica;
    - gli serve un valore che distingua un thread dall'altro;
    - quel parametro in realtà viene ignorato.

    Edit: ho cercato la definizione della funzione: http://man7.org/linux/man-pages/man3/pthread_create.3.html
    Quel parametro serve per passare uno o più parametri al nuovo thread e corrisponde esattamente a void *threadid.
  • Re: Cast tra void* ed altri tipi

    Leggendo la documentazione:
    https://computing.llnl.gov/tutorials/pthreads/#PassingArguments
    al paragrafo:
    Thread Management::Passing Arguments to Threads
    è riportato il caso in cui l'argomento fosse passato come (void*)&t nell'esempio 3 ( Example 3 - Thread Argument Passing (Incorrect) ) ed è spiegato il motivo per cui sarebbe incorretto.

    Simki98 ha scritto:


    Dato che il prototipo della funzione si aspetta un puntatore, dunque un indirizzo...
    Non è detto che il tipo void* debba essere per forza un puntatore. Il tipo void* in fin dei conti rappresenta numeri interi positivi la cui dimensione in byte dipende dal sistema, è utilizzato per puntatori perché gli indirizzi di memoria in un sistema sono costituiti da numeri interi positivi con lunghezza definita dal sistema stesso. Questo però non impedisce che possa essere adoperato per altre cose, soprattutto in casi simili dove l'argomento può avere forme diverse, come questa:

    (void *) &thread_data_array[t]
Devi accedere o registrarti per scrivere nel forum
2 risposte