2012-04-29 20 views
5

¿Es posible lanzar un puntero a un int sin signo, y luego volverlo a un puntero? Estoy tratando de almacenar el puntero a una estructura en una variable pthread_t, pero parece que no puedo hacer que funcione. Aquí hay algunos fragmentos de mi código (estoy creando una biblioteca de gestión de hilos a nivel de usuario). Cuando trato de imprimir el tid del hilo me da un número de basura largo.Almacenar la dirección de un puntero en un int sin signo en C

Editar: No importa, lo tengo para trabajar.

me cambió

thread = (pthread_t) currentThread; 

a

*thread = (pthread_t) currentThread; 

pensó que era algo estúpido como eso.


Programa de prueba:

pthread_t thread1; 
pthread_t thread2; 

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

Mi biblioteca:

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

No entiendo - se han definido pthread_create en su propia biblioteca? ¿Por qué un nombre entra en conflicto con la función habitual de ese nombre? –

+0

Es un proyecto para la escuela. –

+0

No importa, lo tengo funcionando. Editado mi publicación original. –

Respuesta

3

Claro que es posible, si se asegura de que su unsigned int es el mismo tamaño que un void * en su sistema.

Si tiene algún código que no funciona, publíquelo.

Editar: Deberías leer sobre intptr_t, p. aquí: Why/when to use `intptr_t` for type-casting in C?

+0

Igual o superior. + te olvidaste de la alineación. –

+0

Claro, si unsigned int es más grande, supongo que está bien. En cuanto a la alineación, ¿tiene alguna circunstancia específica en mente que pueda ser problemática? –

+1

Específico - no. Pero, en general, diferentes tipos de POD pueden requerir requisitos de alineación diferentes para una arquitectura de CPU. Esto no está cubierto por el estándar C, así que si mañana escribo mi CPU en Verilog que tiene unsigned int de tamaño 64 bit y requiere que esté alineado por 16, y luego hace un puntero de 8 bits requiriendo que esté alineado en 8, eso podría resultar en foobar :) La moral - si no lo sabes, usa 'memcpy'. + pthread_t es de tipo opaco ... –

5

No. En muchos sistemas, el tipo de puntero es más grande que el tipo int. Si tiene un problema para usar pthread_t, pregunte al respecto, int no es la respuesta.

Por ejemplo, en mi máquina, el siguiente código:

#include <stdio.h> 

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

salidas:

unsigned int = 4 
pointer = 8 
Cuestiones relacionadas