2012-04-29 9 views
5

Czy jest możliwe rzutowanie wskaźnika na unsigned int, a następnie rzutowanie go z powrotem na wskaźnik? Próbuję przechowywać wskaźnik do struct w zmiennej pthread_t, ale nie mogę go uruchomić. Oto kilka fragmentów mojego kodu (tworzę bibliotekę zarządzania wątkami na poziomie użytkownika). Kiedy próbuję wydrukować numer wątku, daje mi to trochę długiego numeru śmieci.Przechowywanie adresu wskaźnika w unsigned int w C

Edycja: Nieważne, mam to do roboty.

Zmieniłem

thread = (pthread_t) currentThread; 

do

*thread = (pthread_t) currentThread; 

Pomyślałem, że to coś tak głupiego.


Program testowy:

pthread_t thread1; 
pthread_t thread2; 

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

Moja biblioteka:

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

Nie rozumiem - zdefiniowaniu pthread_create w swoim własnym biblioteki? Dlaczego nazwa jest sprzeczna ze zwykłą funkcją o tej nazwie? –

+0

To jest projekt dla szkoły. –

+0

Nieważne, działa. Edytowałem mój oryginalny wpis. –

Odpowiedz

3

Oczywiście jest to możliwe, jeśli upewnij się, że unsigned int ma taki sam rozmiar jak void * w systemie.

Jeśli masz jakiś kod, który nie działa, opublikuj go.

Edycja: Powinieneś przeczytać o intptr_t, np. tutaj: Why/when to use `intptr_t` for type-casting in C?

+0

To samo lub więcej. + zapomniałeś o wyrównaniu. –

+0

Oczywiście, jeśli niepodpisane int jest większe, to myślę, że to jest w porządku. Jeśli chodzi o wyrównanie, czy masz na myśli określoną sytuację, która może być problematyczna? –

+1

Określony - nie. Ogólnie jednak różne typy POD mogą wymagać różnych wymagań dotyczących wyrównania w architekturze procesora. Nie jest to objęte standardem C, więc jeśli jutro napiszę swój procesor w Verilog, który ma niepodpisaną int rozmiaru 64-bitowego i wymaga wyrównania do 16, a następnie uczyni wskaźnik o 8 bitach, wymagający wyrównania na 8, może to spowodować foobar :) Morale - jeśli nie wiesz, użyj 'memcpy'. + pthread_t jest typu nieprzezroczystego ... –

5

Nie. W wielu systemach typ wskaźnika jest większy niż typ int. Jeśli masz problem z użyciem pthread_t, zapytaj o to, int nie jest odpowiedzią.

Na przykład, na moim komputerze, następujący kod:

#include <stdio.h> 

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

wyjścia:

unsigned int = 4 
pointer = 8 
Powiązane problemy