Speichern einen Zeiger die Adresse eines unsigned int in C
Ist es möglich, aus ein Zeiger auf ein unsigned int, dann später warf es wieder zu einem Zeiger? Ich versuche zu speichern, die Zeiger auf eine struct in eine pthread_t variable, aber ich kann nicht scheinen, um es zu arbeiten. Hier einige Ausschnitte von meinem code (ich erstelle eine user-level-thread-management-Bibliothek). Wenn ich versuche, drucken Sie die tid des Threads es gibt mir einige lange garbage-Nummer.
Edit: Never mind, ich habe es zu arbeiten.
Änderte ich
thread = (pthread_t) currentThread;
zu
*thread = (pthread_t) currentThread;
Dachte, es war etwas doof so was.
Test-Programm:
pthread_t thread1;
pthread_t thread2;
pthread_create(&thread1, NULL, runner, NULL);
pthread_create(&thread2, NULL, runner, NULL);
pthread_join(&thread2, NULL);
Meine Bibliothek:
typedef struct queueItem
{
int tid;
ucontext_t context;
int caller;
struct queueItem *joiningOn;
struct queueItem *nextContext;
} queueItem;
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
{
thread = (pthread_t) currentThread;
}
...
int pthread_join(pthread_t thread, void **retval)
{
queueItem *t = (queueItem *) thread;
if(runningContext->joiningOn != NULL) //Current thread is already waiting on another
return EINVAL;
if(t == NULL) //If thread to join on is invalid
return 0;
fprintf(stdout, "JOINEE: %d\n", t->tid); //Prints weird number
runningContext->caller = JOIN;
runningContext->joiningOn = t;
swapcontext(&(runningContext->context), &scheduleContext);
}
Ich verstehe nicht,--Sie definiert haben pthread_create in Ihrer eigenen Bibliothek? Warum machen Sie einen Namen in Konflikt mit der üblichen Funktion mit diesem Namen??
Es ist ein Projekt für die Schule.
Nevermind, habe es funktioniert. Bearbeitet meinem ursprünglichen post.
Es ist ein Projekt für die Schule.
Nevermind, habe es funktioniert. Bearbeitet meinem ursprünglichen post.
InformationsquelleAutor Anthony C. | 2012-04-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher, es ist möglich, wenn Sie sicherstellen, dass Ihr unsigned int die gleiche Größe wie ein void* auf Ihrem system.
Wenn Sie haben einige code, der nicht funktioniert, stellen.
Edit: Man sollte Lesen über
intptr_t
, z.B. hier: Warum /Wann `intptr_t " für Typ-casting in C?Sicher, wenn unsigned int größer ist, ich denke, das ist OK. Als für die Ausrichtung, haben Sie einen bestimmten Umstand im Hinterkopf, dass könnte problematisch sein?
Specific - Nr. Aber im Allgemeinen, die unterschiedlichen POD-Typen erfordern unterschiedliche alignment-Anforderung von einer CPU-Architektur. Das ist nicht abgedeckt durch den C-standard, also, wenn morgen Schreibe ich meine CPU in Verilog, unsigned int im Format 64-bit und muss ausgerichtet werden, indem Sie 16, und dann ein Zeiger von 8 bit, die ihn benötigt, ausgerichtet werden auf 8, das könnte Ergebnis in foobar 🙂 Die Moral - wenn Sie nicht wissen, verwenden Sie
memcpy
. + pthread_t ist undurchsichtig geben...Sicher, das kopieren des bytes aus dem int, der Zeiger macht Sinn, wenn Sie sich sorgen über Portabilität. Ich vermute, der OP hat nicht gelernt, dass Niveau der Verfeinerung noch. 🙂 +1 sowieso.
Ich habe einige meiner code. Die Länge der pthread_t Typ (unsigned int) und queueItem Zeiger sind beide 4 auf meinem Rechner.
InformationsquelleAutor John Zwinck
Nicht. Auf vielen Systemen pointer-Typ ist größer als der int-Typ. Wenn Sie ein problem haben verwenden pthread_t, Fragen Sie, " int " ist nicht die Antwort.
Beispielsweise auf meinem Rechner, der folgende code:
Ausgänge:
InformationsquelleAutor MByD