में 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
रीसायकल हैंडल के लिए कैसे प्राप्त कर सकता हूं? दुर्भाग्य से मैं आसानी से कर्नेल नहीं बदल सकता। धन्यवाद!
अतीत को नमस्कार! मुझे नहीं लगता कि इस तरह के कर्नेल व्यवहार पर आपके कार्यक्रम के आधार पर एक अच्छा विचार है, आपको अपने कार्यक्रम को ठीक करना चाहिए। – PlasmaHH
@PlasmaHH: कार्यक्रम ठीक है; 'pthread_join' को सभी थ्रेड संसाधनों को जारी करना चाहिए। समस्या यह है कि, उस विशेष कर्नेल संस्करण पर, यह स्पष्ट रूप से नहीं करता है। –
@ माइकसेमोर: आपको क्या लगता है? मेरे लिए ऐसा लगता है कि यह हर बार एक अलग हैंडल सौंप रहा है, जो कुछ ठीक है, भले ही पिछले हैंडल को मुक्त कर दिया गया हो। बस एक = malloc (5) की तरह; मुक्त (ए); एक == malloc (5); सच नहीं होना चाहिए। – PlasmaHH