2010-06-04 7 views
6

Ich habe gerade angefangen, pthreads API zu lernen und folge dem Tutorial hereIst es legitim, ein Argument als ungültig zu bezeichnen?

In einem Beispielprogramm von pthread_create erstellt das Beispielprogramm eine lange Variable und übergibt den Wert, typecasted als void*. In der Thread-Entry-Funktion dereferenziert es genau wie eine lange.

Ist das echt? Ich verstehe, wenn ich die Adresse der Variable t übergebe, würde jeder Thread auf der gleichen Variablen und nicht auf einer Kopie davon handeln. Können wir das machen, weil es ein void* ist und der Compiler keine Ahnung hat, welchen Typ wir senden?

#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); 
     } 
    } 
    pthread_exit(NULL); 
} 
+0

Also ist Ihre Frage über die Gültigkeit der Besetzung oder die Gültigkeit des übergebenen Zeigers als 4. Argument für Pthread_create()? – qrdl

+0

@qrdl: eigentlich ist es beides, aber ich war mehr daran interessiert, das vierte Argument für pthread_create zu übergeben, was complier denken lässt, dass du tatsächlich eine Adresse sendest. –

Antwort

4

Dies funktioniert so lange wie sizeof(long) <= sizeof(void*), und jeder Wert von long kann als void* dargestellt werden.

Besser wäre es, die Adresse der Variablen zu übergeben. Sie können von einer T* bis void* und wieder sicher und ohne Annahme zurückwerfen.

+1

@Charles 'sizeof (void)' und 'sizeof (void *)' sind verschiedene Bestien – qrdl

+0

@qrdl: Richtig du bist! –

4

Es ist so legitim wie jede Art von Typumwandlung. Der Punkt ist, dass nichts mit dem Wert getan werden kann, auf den das Argument zeigt, bis es typecast ist, daher tid = (long)threadid.

Überprüfen Sie die ältere Q & A When to use a void pointer?.

+0

Sie sagen, 'void *' bedeutet "Zeiger auf etwas", aber das "etwas" muss definiert werden, bevor es verwendet werden kann, oder? – Abel

+0

@Abel: rechts. Der Punkt ist, wenn Sie etwas mit einem Zeiger tun möchten, dem die Typinformation nicht gegeben werden kann. –

Verwandte Themen