Gewusst wie: Umwandlung einer Ganzzahl in void-pointer?
Beim arbeiten mit Threads in C, ich bin vor der Warnung
"warning: cast to pointer from integer of different size"
Den code wie folgt
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<pthread.h>
void *print(void *id)
{
int a=10;
printf("My thread id is %ld\n",pthread_self());
printf("Thread %d is executing\n",id);
return (void *) 42;
}
int main()
{
pthread_t th[5];
int t;
int i;
int status;
void *ret;
for(i=0;i<5;i++)
{
status=pthread_create(&th[i],NULL,print,(void *)i); //Getting warning at this line
if(status)
{
printf("Error creating threads\n");
exit(0);
}
pthread_join(th[i],&ret);
printf("--->%d\n",(int *)ret);
}
pthread_exit(NULL);
}
Kann jemand erklären, wie die übergabe eines integer in eine Funktion erhält (void * ) als parameter?
InformationsquelleAutor der Frage Dinesh | 2011-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine gute Methode, um pass Ganzzahlen zu neuen pthreads, wenn es das ist, was Sie brauchen. Sie müssen nur unterdrücken Sie die Warnung, und das wird es tun:
Diskussion
Diese verletzen kann, Ihre Sensibilität, aber es ist sehr kurze und hat keine race conditions (als Sie haben würden, wenn Sie
&i
). Keinen Sinn in ein paar Dutzend Zeilen extra-code, um eine Reihe von numerierten threads.Daten Rennen
Hier ist ein bad version mit einem data race:
Nun, was passiert, wenn ich es mit dem thread-sanitizer?
(Schauen Sie sich auch wie gedruckt "5" zweimal...)
InformationsquelleAutor der Antwort Dietrich Epp
können Sie etwas wie das hier tun:
Ausgabe:
vorbei ein eindeutiger Zeiger auf die einzelnen thread nicht Rennen, und man kann/speichern jede Art von Informationen, die in den th struct
InformationsquelleAutor der Antwort jackdoe
übergeben Sie den int-Wert als void-Zeiger wie
(void *)&n
wo n ist integer, und in der Funktion akzeptieren void-Zeiger als parameter wievoid foo(void *n);
und schließlich in der Funktion konvertieren void-Zeiger int wie,int num = *(int *)n;
. auf diese Weise werden Sie nicht bekommen, eine Warnung.InformationsquelleAutor der Antwort Rahul
ändern:
:
Den reinterpret_cast macht die int die Größe des Zeigers und die Warnung zu stoppen. Im Grunde ist es eine bessere version (void *)i.
InformationsquelleAutor der Antwort user3416126