2012-05-21 14 views
5

धागे बढ़ावा देने के लिए :: thread_group की तरह जोड़ा जाता है:थ्रेड थ्रेड ऑब्जेक्ट को कैसे हटाएं जब धागा स्वयं समाप्त हो जाता है?

boost::thread_group my_threads; 
boost::thread *t = new boost::thread(&someFunc); 
my_threads.add_thread(th); 

सब बनाया बढ़ावा :: धागा वस्तुओं नष्ट हो जाती हैं केवल जब my_threads वस्तु क्षेत्र से बाहर है। लेकिन मेरे कार्यक्रम मुख्य धागे निष्पादन के दौरान बहुत सारे धागे पैदा करता है। तो यदि लगभग 50 धागे पहले से ही किए गए हैं, तो लगभग 1,5Gb स्मृति का उपयोग प्रोग्राम द्वारा किया जाता है और यह स्मृति केवल मुख्य प्रक्रिया समाप्ति पर मुक्त होती है।

प्रश्न यह है: थ्रेड फ़ंक्शन समाप्त होने पर इन बूस्ट :: थ्रेड ऑब्जेक्ट को कैसे हटाएं?

+1

मेरा मानना ​​है कि यह प्रश्न समान है: http://stackoverflow.com/questions/3970818/whats-the-best-way-to-delete-boostthread-object-right-after-its-work-is-compl – Naveen

+0

@Naveen, मुझे वास्तव में एक रैपर की आवश्यकता है जो मुख्य पूल के लिए पूछे जाने पर सभी पूल किए गए बच्चों के धागे को बाधित कर सकता है। आपके द्वारा लिंक किए गए प्रश्न में वे केवल एक धागा बनाने और बूस्ट :: थ्रेड ऑब्जेक्ट को अलग करने की सलाह देते हैं। समाधान के लिए –

उत्तर

6

आप इस तरह sth, लेकिन मन तुल्यकालन कर सकता है (यह संदर्भ की बजाय साझा सूचक का उपयोग करने के बढ़ावा देने के लिए :: thread_group सुनिश्चित होने तक कर रहे हैं, कि धागा समूह काफी देर तक रहते हैं बेहतर है):

void someFunc(..., boost::thread_group & thg, boost::thread * thisTh) 
{ 
    // do sth 

    thg.remove_thread(thisThr); 
    delete thisTh; // we coud do this as thread of execution and boost::thread object are quite independent 
} 

void run() 
{ 
    boost::thread_group my_threads; 
    boost::thread *t = new boost::thread(); // invalid handle, but we need some memory placeholder, so we could pass it to someFunc 
    *t = boot::thread(
    boost::bind(&someFunc, boost::ref(my_threads), t) 
); 
    my_threads.add_thread(t); 
    // do not call join 
} 

आप at_thread_exit() फ़ंक्शन भी देख सकते हैं।

वैसे भी, बूस्ट :: थ्रेड ऑब्जेक्ट्स 30 एमबी वजन नहीं करना चाहिए।

+0

धन्यवाद। जवाब का इंतजार कर रहे थे, थ्रेड फंक्शन में बूस्ट :: थ्रेड पॉइंटर भेजने का भी विचार किया। –

+0

मैं ** ** ** ** ** और 1 ** फ्रीबीएसडी ** ** ** htop ** का उपयोग कर रहा हूं। जेनेटू मशीनों पर ** वीआईआरटी ** होप का कॉलम ~ 450 एमबी दिखाता है जब 15 थ्रेड बनाए जाते हैं और चलते हैं। फ्रीबीएसडी पर थ्रेड की संख्या के साथ वीआईआरटी कॉलम ~ 65300 केबी दिखाता है। मैं उलझन में हूँ –

+0

मुझे एहसास हुआ कि गलत कॉलम देख रहा था। ** आरईएस ** सभी मशीनों पर ** 33 एमबी ** के बारे में दिखाता है। बीटीडब्ल्यू, आप mutex का उपयोग किये बिना थ्रेड में 'thg.remove_thread (thisThr) 'को कॉल करते हैं। क्या ये सुरक्षित है?! –

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

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