2010-07-02 17 views
5

मेरे पास यह कोड है और मुझे अपेक्षित परिणाम नहीं मिल रहे हैं ... क्या गलत है?_beginthread() के लिए तर्क पारित करना - क्या गलत है?

typedef struct { 
    int data1; 
    int data2; 
}t; 

void foo(int a, int b) { 

    Handle handle; 
    t arg; 
    arg.data1 = a; 
    arg.data2 = b; 
    handle = (HANDLE) _beginthread(myFunc, 0, (void*) &arg); 
} 

void myFunc(void *param) { 
    t *args = (t*) param; 
    int x = args->data1; 
    int y = args->data2; 
    printf("x=%d, y=%d\n", x, y); 
} 

उत्तर

5

arg एक स्थानीय चर foo में परिभाषित किया गया है - यह रूप में जल्द ही है कि समारोह समाप्त होता है के रूप में नष्ट किया जा सकता है, लेकिन myFunc जो एक और धागा में चल रहा है अभी भी यह तक पहुँचने का प्रयास किया जाएगा। आपको ढेर पर arg आवंटित करना चाहिए और आपके द्वारा किए जाने के बाद थ्रेड में इसे नष्ट करना चाहिए।

void foo(int a, int b) { 
    HANDLE handle; 
    t *arg; 
    arg = (t *)malloc(sizeof(t)); 
    arg->data1 = a; 
    arg->data2 = b; 
    handle = (HANDLE) _beginthread(myFunc, 0, (void*) arg); 
} 

void myFunc(void *param) { 
    t *args = (t*) param; 
    int x = args->data1; 
    int y = args->data2; 
    printf("x=%d, y=%d\n", x, y); 
    free(args); 
} 

यह भी ध्यान दें कि HANDLE सभी कैप्स होना चाहिए।

+0

धन्यवाद, मुझे नहीं पता कि मुझे एहसास नहीं हुआ कि उस समय – emge

+0

@ कैसाब्लांका, मुझे लगता है कि आपने एक टाइपो बनाया है। हैंडल = (हैंडल) _beginthread (myFunc, 0, (शून्य *) args); /// इसके तर्क धन्यवाद Alok.kr. –

+0

यह इंगित करने के लिए धन्यवाद, मैंने इसे अभी सही कर दिया है। – casablanca

0

आपका तर्क चर आपके फ़ंक्शन foo में एक स्थानीय चर है, इसलिए यह फ़ंक्शन समाप्त होने के बाद स्मृति में उपलब्ध नहीं होगा।

1.define अपने आर्ग चर विश्व स्तर पर:

अतः आपको दो काम कर सकते हैं।

typedef struct { 
    int data1; 
    int data2; 
}t; 
t arg; 

या आप सहायता पर तर्क के लिए स्मृति आवंटित भी कर सकते हैं, जैसा कि कैसाब्लांका ने समझाया है।

धन्यवाद Alok.Kr.

संबंधित मुद्दे