2010-10-19 6 views
16

मैं एक new ऑपरेटर के साथ boost::thread वस्तु बना सकते हैं और अपना काम खत्म करने के लिए इस सूत्र का इंतजार किए बिना जारी रखने के लिए:अपने काम पूरा होने के बाद बूस्ट :: थ्रेड ऑब्जेक्ट को हटाने का सबसे अच्छा तरीका क्या है?

void do_work() 
{ 
    // perform some i/o work 
} 

boost::thread *thread = new boost::thread(&do_work); 

मुझे लगता है, यह thread हटाए जाने के लिए काम हो गया है आवश्यक है। थ्रेड समाप्ति के स्पष्ट रूप से इंतजार किए बिना इसका सबसे अच्छा तरीका क्या है?

+1

गतिशील रूप से धागा क्यों बनाते हैं? –

+0

@ मार्टिन यॉर्क: क्योंकि मैं चर के दायरे को छोड़ने के बाद थ्रेड ऑब्जेक्ट को नष्ट नहीं करना चाहता हूं। – itsvetkov

+2

लेकिन यदि आप इसे केवल दायरे से बाहर निकलने देते हैं तो आप इसे एक्सेस नहीं कर सकते (और इस प्रकार आप रिसाव)। इसका मतलब यह नहीं है कि आप इसके साथ कुछ भी नहीं कर सकते हैं और निष्पादन का वास्तविक धागा अभी भी जिंदा है, इसलिए यह व्यर्थ लगता है। नोट: आपको व्यावहारिक रूप से ** ** कभी भी रॉ रॉइंटर नहीं होना चाहिए। –

उत्तर

19

boost::thread ऑब्जेक्ट का जीवनकाल और मूल धागा का जीवनकाल असंबंधित है। boost::thread ऑब्जेक्ट किसी भी समय दायरे से बाहर जा सकता है।

boost::thread वर्ग से documentation

एक फ़ाइल के जीवनकाल एक iostream वस्तु जो फ़ाइल का प्रतिनिधित्व करता है के जीवनकाल से अलग हो सकता बस के रूप में, निष्पादन की एक धागा के जीवनकाल धागे से अलग हो सकता है ऑब्जेक्ट जो निष्पादन के धागे का प्रतिनिधित्व करता है। विशेष रूप से,() में शामिल होने के लिए कॉल के बाद, निष्पादन का धागा अब अस्तित्व में नहीं रहेगा, भले ही थ्रेड ऑब्जेक्ट अपने सामान्य जीवनकाल के अंत तक अस्तित्व में रहे। बातचीत भी संभव है; यदि किसी थ्रेड ऑब्जेक्ट को बिना किसी जोड़ के नष्ट कर दिया जाता है() जिसे पहले बुलाया जाता है, तो निष्पादन का धागा तब तक जारी रहता है जब तक उसका प्रारंभिक कार्य पूरा न हो जाए।

संपादित: तुम सिर्फ एक धागा शुरू करने और कभी नहीं आह्वान join करने की जरूरत है, तो आप एक समारोह के रूप धागा के निर्माता का उपयोग कर सकते हैं:

// Launch thread. 
boost::thread(&do_work); 

हालांकि, मैं आप ऐसा संकेत नहीं करते , भले ही आपको लगता है कि आप सुनिश्चित हैं कि थ्रेड main() से पहले पूरा हो जाएगा।

+1

धन्यवाद। मैं बूस्टों को बढ़ावा देने के लिए नया हूं, इसलिए यह समस्या मेरी गलतफहमी में थी कि यह कैसे काम करता है। – itsvetkov

+0

जहां तक ​​मुझे पता है कि मूल प्लेटफॉर्म किसी भी तरह से प्लेटफार्मों पर कैसे काम करते हैं। तो जब तक धागा विनाशक शामिल नहीं होता है(), जो अपवादों की उपस्थिति में एक गड़बड़ी होगी, यह केवल एक सामान्य परिणाम है। –

13

आप

boost::thread t(&do_work); 
t.detach(); 

उपयोग कर सकते हैं एक बार धागा अलग है यह अब boost::thread वस्तु के स्वामित्व में है; वस्तु को नष्ट किया जा सकता है और धागा चलना जारी रहेगा। boost::thread विनाशक detach() पर कॉल करता है यदि ऑब्जेक्ट चलने वाले थ्रेड का मालिक है, इसलिए t नष्ट हो जाने का परिणाम भी होगा।

3

मैं तुम्हें, को बढ़ावा देने :: shared_ptr उपयोग करें ताकि आप ध्यान जब धागा वस्तु को हटाने के लिए नहीं ले जाएगा सुझाव देते हैं।

boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work)); 
+1

'do_work' समाप्त होने पर यह थ्रेड ऑब्जेक्ट कैसे हटाया जाता है? –