2012-04-29 5 views
5

È possibile eseguire il cast di un puntatore a un int non firmato, quindi ricondurlo in seguito a un puntatore? Sto cercando di memorizzare il puntatore su una struttura in una variabile pthread_t, ma non riesco a farlo funzionare. Ecco alcuni frammenti del mio codice (sto creando una libreria di gestione dei thread di livello utente). Quando provo a stampare il codice del thread mi dà un lungo numero di spazzatura.Memorizzare l'indirizzo di un puntatore in un int unsigned in C

Modifica: Non importa, ho avuto modo di funzionare.

ho cambiato

thread = (pthread_t) currentThread; 

a

*thread = (pthread_t) currentThread; 

pensato che fosse qualcosa di stupido come quello.


programma di test:

pthread_t thread1; 
pthread_t thread2; 

pthread_create(&thread1, NULL, runner, NULL); 
pthread_create(&thread2, NULL, runner, NULL); 
pthread_join(&thread2, NULL); 

Biblioteca personale:

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); 
} 
+0

Non capisco - è stato definito pthread_create nella vostra libreria? Perché fare un nome in conflitto con la solita funzione con quel nome ?? –

+0

È un progetto per la scuola. –

+0

Non importa, ha funzionato. Modificato il mio post originale. –

risposta

3

Certo che è possibile, se si assicurarsi che il unsigned int è la stessa dimensione di un void * nel sistema.

Se si dispone di codice che non funziona, postarlo.

Modifica: è necessario leggere il numero intptr_t, ad es. qui: Why/when to use `intptr_t` for type-casting in C?

+0

uguale o superiore. + hai dimenticato l'allineamento. –

+0

Certo, se int unsigned è maggiore suppongo che sia OK. Per quanto riguarda l'allineamento, hai in mente una circostanza specifica che potrebbe essere problematica? –

+1

Specifico - no. Ma in generale, diversi tipi di POD possono richiedere requisiti di allineamento diversi da un'architettura CPU. Questo non è coperto dallo standard C, quindi se domani scriverò la mia CPU in Verilog che ha unsigned int della dimensione 64 bit e richiede che sia allineata per 16, e quindi fare un puntatore di 8 bit che richiede che sia allineato su 8, ciò potrebbe comportare il furbo :) Il morale: se non lo sai, usa 'memcpy'. + pthread_t è di tipo opaco ... –

5

No. Su molti sistemi il tipo di puntatore è più grande del tipo int. Se hai problemi ad usare pthread_t, chiedi informazioni a riguardo, int non è la risposta.

Per esempio, sulla mia macchina, il seguente codice:

#include <stdio.h> 

int main() { 
     printf("unsigned int = %lu\n", sizeof(unsigned int)); 
     printf("pointer = %lu\n", sizeof(void*)); 
     return 0; 
} 

uscite:

unsigned int = 4 
pointer = 8