2009-03-08 10 views
6

मुझे सी में थ्रेड में अपने पहले प्रयास में कुछ परेशानी हो रही है। मैं एक बहुत ही सरल सर्वर प्रोग्राम लिखने की कोशिश कर रहा हूं जो सॉकेट कनेक्शन स्वीकार करता है और इसे संसाधित करने के लिए एक नया धागा शुरू करता है। ऐसा लगता है कि यह ठीक काम करता है सिवाय इसके कि यह केवल 300 थ्रेड (303, कभी-कभी 304) बनायेगा, इससे पहले कि pthread_create() EAGAIN कोड के साथ विफल हो जाता है, जिसका अर्थ है:क्यों pthread_create() केवल 2 धागे सक्रिय के साथ विफल होगा?

"सिस्टम में एक और धागा बनाने के लिए आवश्यक संसाधनों की कमी थी, या किसी प्रक्रिया में थ्रेड की कुल संख्या पर सिस्टम-लगाया गया सीमा {PTHREAD_THREADS_MAX} पार हो जाएगी। "

यह 303 धागे एक ही समय में नहीं है - प्रत्येक धागा जीडीबी द्वारा पुष्टि की जाती है। प्रत्येक बार प्रक्रिया अनुरोध फ़ंक्शन को बुलाया जाता है, वहां दो धागे चलते हैं।

तो इसका मतलब है कि "सिस्टम में आवश्यक संसाधनों की कमी है"। मेरा सवाल है (और यह थोड़ा बेवकूफ हो सकता है) - ये संसाधन क्या हैं? संभवतः यह मेरे कार्यक्रम में एक स्मृति रिसाव है (निश्चित रूप से संभव है, यहां तक ​​कि संभवतः), लेकिन मैंने सोचा होगा कि यह भी 300 से अधिक प्रबंधन कर सकता है क्योंकि शेष कार्यक्रम बहुत कम करता है।

मैं यह कैसे पता लगा सकता हूं कि यह प्रोग्राम यह सुनिश्चित करने के लिए कितना मेमोरी उपलब्ध है कि यह उससे बाहर हो रहा है? बहुत सारी मेमोरी है और स्वैप मुफ्त है इसलिए संभवतः ओएस (लिनक्स) द्वारा लगाई गई कृत्रिम सीमा है।

धन्यवाद

+0

आप पोस्ट कर सकते हैं कोड स्निपेट जो धागे बनाता है और नष्ट करता है? –

उत्तर

10

आप (विशेषता PTHREAD_CREATE_DETACHED साथ धागा बनाने नहीं कर रहे हैं या उन्हें pthread_detach() साथ अलग करने, आप प्रत्येक बनाया धागे पर pthread_join() कॉल करने के लिए के बाद यह इसके साथ जुड़े संसाधनों को मुक्त करने के बाहर निकालता पड़ सकता है।

+0

धन्यवाद! बस उस विशेषता को सेट करें और यह 4000 धागे से पहले अच्छी तरह से चला गया है और गिनती है। बहुत धन्यवाद - यह लगभग 3 घंटे निराशा तय है :) – Ray2k

0

संभवतः एक छोटे से overkill (?) लेकिन Valgrind आप लिनक्स में memleaks का पता लगाने कर सकते हैं।

क्या आप शायद कुछ कोड स्निपेट पोस्ट कर सकते हैं? पसंदीदा रूप से वे हिस्सों जहां आप आवंटित/मुक्त मेमोरी/सॉकेट और जहां आप अपना धागे बनाते हैं।

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