सी

2012-04-29 9 views
5

में एक हस्ताक्षरित int में एक पॉइंटर का पता संग्रहीत करना क्या एक हस्ताक्षर किए गए int पर पॉइंटर डालना संभव है, फिर बाद में इसे पॉइंटर पर डाला जाए? मैं पॉइंटर को एक pthread_t चर में एक स्ट्रक्चर में स्टोर करने की कोशिश कर रहा हूं, लेकिन मुझे इसे काम करने के लिए प्रतीत नहीं होता है। यहां मेरे कोड के कुछ स्निपेट हैं (मैं उपयोगकर्ता-स्तरीय थ्रेड प्रबंधन लाइब्रेरी बना रहा हूं)। जब मैं थ्रेड के टिप को मुद्रित करने का प्रयास करता हूं तो यह मुझे कुछ लंबा कचरा नंबर देता है।सी

संपादित करें: कोई बात नहीं, मुझे यह काम करने के लिए मिला।

मैं

thread = (pthread_t) currentThread; 

बदल

को
*thread = (pthread_t) currentThread; 

लगा कि यह कुछ ऐसा है जो की तरह बेवकूफ था।


टेस्ट कार्यक्रम:

pthread_t thread1; 
pthread_t thread2; 

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

मेरी लायब्रेरी:

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

मुझे समझ नहीं आता है - आप अपने पुस्तकालय में pthread_create परिभाषित किया है? उस नाम से सामान्य फ़ंक्शन के साथ नाम क्यों संघर्ष करते हैं ?? –

+0

यह स्कूल के लिए एक परियोजना है। –

+0

कभी नहीं, इसे काम कर रहा है। मेरी मूल पोस्ट संपादित की। –

उत्तर

3

ज़रूर यह संभव है, यदि आप सुनिश्चित करें कि आपके अहस्ताक्षरित int अपने सिस्टम पर एक शून्य * के रूप में एक ही आकार है या नहीं।

यदि आपके पास कुछ कोड है जो काम नहीं कर रहा है, तो इसे पोस्ट करें।

संपादित करें: आपको intptr_t, उदाहरण के बारे में पढ़ना चाहिए यहां: Why/when to use `intptr_t` for type-casting in C?

+0

वही या अधिक। + आप संरेखण के बारे में भूल गए हैं। –

+0

निश्चित रूप से, अगर हस्ताक्षरित int बड़ा है तो मुझे लगता है कि यह ठीक है। संरेखण के लिए, क्या आपके मन में एक विशिष्ट परिस्थिति है जो समस्याग्रस्त हो सकती है? –

+1

विशिष्ट - नहीं। लेकिन सामान्य रूप से, विभिन्न पीओडी प्रकारों को एक सीपीयू आर्किटेक्चर द्वारा अलग संरेखण आवश्यकता की आवश्यकता हो सकती है। यह सी मानक द्वारा कवर नहीं किया गया है, इसलिए यदि कल मैं अपने सीपीयू को वेरिलोग में लिखता हूं जिसने आकार 64 बिट के बिना हस्ताक्षर किए हैं और इसे 16 तक गठबंधन करने की आवश्यकता है, और फिर 8 बिट्स के पॉइंटर को 8 पर गठबंधन करने की आवश्यकता है, जिसके परिणामस्वरूप foobar :) मनोबल - यदि आप नहीं जानते हैं, तो 'memcpy' का उपयोग करें। + pthread_t अपारदर्शी प्रकार है ... –

5

नहीं। कई प्रणालियों पर सूचक प्रकार int प्रकार से बड़ा है। अगर आपको pthread_t का उपयोग करने में कोई समस्या है, तो इसके बारे में पूछें, int उत्तर नहीं है।

उदाहरण के लिए, मेरी मशीन पर, निम्नलिखित कोड:

#include <stdio.h> 

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

आउटपुट:

unsigned int = 4 
pointer = 8