2012-07-05 11 views
6

में pthread_create अंतर मेरे पास kernel 2.4.20 और kernel 2.4.38 चल रहे दो सिस्टम पर कुछ कोड है। वे दोनों है gcc 3.2.2 और glibc 2.3.2लिनक्स कर्नेल 2.4.20 और 2.4.36

kernel 2.4.38 के तहत, pthread_t हैंडल पुन: उपयोग नहीं किया जा रहा है। एक भारी भार परीक्षण के तहत हैंडल 0xFFFFFFFF तक पहुंचने के बाद एप्लिकेशन क्रैश हो जाता है।

(मैं पहली जगह में इस संदिग्ध क्योंकि तैनाती में ऐप्लिकेशन क्रैश जहां आईटी धागे स्कैनर एक नेटवर्क पोर्ट का उपयोग करता सॉकेट कनेक्शन से निपटने के लिए बनाई गई हैं)

यह सरल उदाहरण समस्या पुन:

void* ThreadProc(void* param) 
{ 
    usleep(10000); 
    printf(" Thread 0x%x\n", (unsigned int)pthread_self()); 
    usleep(10000); 
    return NULL; 
} 

int main(int argc, char* argv[]) 
{ 
    pthread_t sThread; 

    while(1) 
    { 
     pthread_create(&sThread, NULL, ThreadProc, NULL); 
     printf("Created 0x%x\n", (unsigned int)sThread); 
     pthread_join(sThread, NULL); 
    }; 

    return 0; 
} 
2.4.20 के तहत

:

Created 0x40838cc0 
    Thread 0x40838cc0 
    Created 0x40838cc0 
    Thread 0x40838cc0 
    Created 0x40838cc0 
    Thread 0x40838cc0 
...and on and on... 

2.4.36 के तहत:

Created 0x4002 
    Thread 0x4002 
    Created 0x8002 
    Thread 0x8002 
    Created 0xc002 
    Thread 0xc002 
...keeps growing... 

मैं kernel 2.4.36 रीसायकल हैंडल के लिए कैसे प्राप्त कर सकता हूं? दुर्भाग्य से मैं आसानी से कर्नेल नहीं बदल सकता। धन्यवाद!

+1

अतीत को नमस्कार! मुझे नहीं लगता कि इस तरह के कर्नेल व्यवहार पर आपके कार्यक्रम के आधार पर एक अच्छा विचार है, आपको अपने कार्यक्रम को ठीक करना चाहिए। – PlasmaHH

+0

@PlasmaHH: कार्यक्रम ठीक है; 'pthread_join' को सभी थ्रेड संसाधनों को जारी करना चाहिए। समस्या यह है कि, उस विशेष कर्नेल संस्करण पर, यह स्पष्ट रूप से नहीं करता है। –

+0

@ माइकसेमोर: आपको क्या लगता है? मेरे लिए ऐसा लगता है कि यह हर बार एक अलग हैंडल सौंप रहा है, जो कुछ ठीक है, भले ही पिछले हैंडल को मुक्त कर दिया गया हो। बस एक = malloc (5) की तरह; मुक्त (ए); एक == malloc (5); सच नहीं होना चाहिए। – PlasmaHH

उत्तर

4

यदि आपके अवलोकन सही हैं, तो केवल दो संभावित समाधान मौजूद हैं।

या तो

  1. कर्नेल अपग्रेड करें। यह आपके लिए संभव हो सकता है या नहीं भी हो सकता है।
  2. अपने आवेदन के भीतर रीसायकल धागे।

विकल्प 2 ऐसा कुछ है जो आप कर सकते हैं भले ही कर्नेल गलत व्यवहार कर रहा हो। आप थ्रेड के पूल को पकड़ सकते हैं जो इस्तेमाल नहीं होने पर सोने की स्थिति में रहता है। थ्रेड पूल एक व्यापक रूप से ज्ञात सॉफ्टवेयर इंजीनियरिंग पैटर्न हैं (http://en.wikipedia.org/wiki/Thread_pool_pattern देखें)। यह शायद आपके लिए बेहतर समाधान है।

+1

हमेशा '3 है। बैक-पोर्ट भविष्य के कर्नेल संस्करण से एक फिक्स और अपने कर्नेल को पुनर्निर्माण करें –

+0

@ केविन ए नौडे: हाँ, मुझे शायद एक थ्रेड पूल लागू करना होगा। मुझे अभी भी उम्मीद है कि कर्नेल 2.4.36 के लिए किसी को सरल कामकाज के बारे में पता चल जाएगा। जैसा मैंने कहा, मैं आसानी से कर्नेल को बदल नहीं सकता। (मेरा खुद का निर्माण सहित) – Scott

+0

@ स्कॉट: यदि आप समस्या को हल करने वाले पैच किए गए कर्नेल को भी नहीं बना सकते हैं, तो आपको कर्नेल को ठीक करने की कोई उम्मीद नहीं है। ऐसा लगता है कि थ्रेड पूलिंग आपका सबसे अच्छा (शायद केवल) विकल्प हो सकता है। –

0

बाहर निकलता है कि मैं भार परीक्षण में ठीक से अपने धागे में शामिल नहीं हो रहा था।

जब मैंने फिर से लोड टेस्ट चलाया, तो थ्रेड हैंडल 0xFFFFF002 तक पहुंच गया और फिर 0x1002 तक चला गया और खुशी से चला गया।

कहानी का नैतिक: मृत सुनिश्चित करें कि आपके धागे शामिल हो गए हैं या अलग हो गए हैं!

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