Stocker un pointeur d'adresse dans un unsigned int en C
Est-il possible de jeter un pointeur sur un unsigned int, puis jeta un pointeur? Je suis en train de stocker le pointeur sur une struct dans un pthread_t variable, mais je n'arrive pas à le faire fonctionner. Voici quelques extraits de mon code (je suis en création d'un utilisateur au niveau de la gestion des threads de la bibliothèque). Lorsque je tente d'imprimer le tid de le thread qu'il me donne quelques ordures nombre.
Edit: Jamais l'esprit, je l'ai eu à travailler.
J'ai changé
thread = (pthread_t) currentThread;
à
*thread = (pthread_t) currentThread;
Pensé que c'était quelque chose de stupide comme ça.
Programme de Test:
pthread_t thread1;
pthread_t thread2;
pthread_create(&thread1, NULL, runner, NULL);
pthread_create(&thread2, NULL, runner, NULL);
pthread_join(&thread2, NULL);
Ma bibliothèque:
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);
}
Je ne comprends pas--vous avez défini pthread_create dans votre propre bibliothèque? Pourquoi en faire un conflit de nom avec la fonction habituelle de ce nom??
C'est un projet pour l'école.
Passons sur le fait, ai eu de travail. Édité mon post original.
C'est un projet pour l'école.
Passons sur le fait, ai eu de travail. Édité mon post original.
OriginalL'auteur Anthony C. | 2012-04-29
Vous devez vous connecter pour publier un commentaire.
Sûr que c'est possible, si vous assurez-vous que votre unsigned int est de la même taille qu'un void* sur votre système.
Si vous avez un peu de code qui ne fonctionne pas, à la poste.
Edit: Vous devriez lire à propos de
intptr_t
, par exemple ici: Pourquoi le /lors de l'utilisation de `intptr_t " pour la conversion de type C?Bien sûr, si unsigned int est plus grande je suppose que c'est OK. Comme pour l'alignement, vous avez une circonstance spécifique dans l'esprit qui pourrait être problématique?
Spécifique - pas de. Mais en général, les différents types POD peut exiger d'avoir différents alignement exigence par une architecture de PROCESSEUR. Ce n'est pas couverte par la norme C, donc si demain j'écris mon CPU en Verilog qui a unsigned int de taille de 64 bits et nécessite, pour être aligné par 16, et ensuite faire un pointeur de 8 bits exigeant qu'il soit aligné sur 8, qui pourrait résultat dans foobar 🙂 Le moral - si vous ne savez pas, utilisez
memcpy
. + pthread_t est opaque...Bien sûr, copier les octets à partir de l'int du pointeur de sens que si vous vous souciez de la portabilité. Je figure que l'OP n'a pas reçu à ce niveau de raffinement encore. 🙂 +1 de toute façon.
J'ai posté quelques de mon code. La longueur de la pthread_t type (unsigned int) et queueItem pointeur sont deux 4 sur ma machine.
OriginalL'auteur John Zwinck
Pas. Sur de nombreux systèmes de type pointeur est plus grand que le type int. Si vous avez un problème pour utiliser pthread_t, demander à ce sujet, l'int n'est pas la réponse.
Par exemple, sur ma machine, le code suivant:
sorties:
OriginalL'auteur MByD