2012-04-29 13 views
5

İşaretçi olmayan bir int için bir işaretçiyi yayınlamak sonra işaretçiye geri vermek mümkün mü? İşaretçiyi pthread_t değişkeninde bir yapıya kaydetmeye çalışıyorum, ancak çalışmayı başaramıyorum. İşte kodumun bazı parçacıkları (kullanıcı düzeyinde bir iş parçacığı yönetimi kitaplığı oluşturuyorum). İş parçacığı sırasını yazdırmaya çalıştığımda bana uzun bir çöp numarası veriyor.İşaretçinin adresini imzasız bir int içinde kaydetme C

Düzeltme: Boşver, işe aldım.

Ben

için

thread = (pthread_t) currentThread; 

değişti

*thread = (pthread_t) currentThread; 

böyle aptalca bir şeydi düşündüm.


Testi programı:

pthread_t thread1; 
pthread_t thread2; 

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

Kütüphanem:

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

anlamıyorum - kendi kütüphanesinde sen pthread_create tanımladığınız? Neden bir isim bu isimle normal işlevle çakışır? –

+0

Okul için bir proje. –

+0

Nevermind, işe koyuldu. Orijinal gönderimi düzenledim. –

cevap

3

Eğer imzasız int sisteminizde bir boşluğa * aynı boyutta olduğundan emin olun eğer, mümkün Tabii.

Çalışmayan bir kodunuz varsa, gönderin.

Düzenleme: intptr_t, vb. Burada, birçok sistemde işaret tipi int türünden büyüktür. Why/when to use `intptr_t` for type-casting in C?

+0

Aynı veya daha büyük. + hizalamayı unuttun. –

+0

Elbette, imzasız int daha büyükse, sanırım sorun yok. Hizalama konusunda sorun yaratabilecek özel bir durumunuz var mı? –

+1

Belirli - hayır. Ancak genel olarak, farklı POD tipleri bir CPU mimarisi tarafından farklı hizalama gereksinimine sahip olmayı gerektirebilir. Bu, C standardı kapsamında değildir, bu yüzden yarın, 64 bit boyutunda imzasız int'ye sahip Verilog'a yazdığımda, 16 ile hizalanmasını ve sonra 8 bitlik bir hizalama yapmasını gerektiren 8 bitlik bir gösterici yapmasını istiyorum. Bu foobar ile sonuçlanabilir :) Moral - bilmiyorsanız, 'memcpy' kullanın. + pthread_t, opak tiptir ... –

5

Pthread_t kullanmayla ilgili bir sorununuz varsa, bunun hakkında soru sorun, int cevap değil.

Örneğin benim makinede, aşağıdaki kod:

#include <stdio.h> 

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

çıkışlar:

unsigned int = 4 
pointer = 8