मुझे लगता है कि मैं शुरू कर रहा हूँ std::thread
और फिर detach()
यह, इसलिए धागा निष्पादन जारी है, भले ही std::thread
एक बार यह प्रतिनिधित्व किया है, गुंजाइश से बाहर चला जाता है।
आगे मान लें कि प्रोग्राम में अलग किए गए थ्रेड 1 में शामिल होने के लिए एक विश्वसनीय प्रोटोकॉल नहीं है , इसलिए main()
बाहर निकलने पर थ्रेडेड थ्रेड अभी भी चलता है।
मुझे मानक (N3797 C ++ 14 ड्राफ्ट में अधिक सटीक) में कुछ भी नहीं मिल रहा है, जो बताता है कि क्या होना चाहिए, न तो 1.10 और न ही 30.3 में प्रासंगिक शब्द शामिल हैं।
1 एक और, शायद समतुल्य, सवाल यह है: "एक अलग किए गए धागे को फिर से शामिल किया जा सकता है", क्योंकि जो भी प्रोटोकॉल आप में शामिल होने के लिए आविष्कार कर रहे हैं, थ्रेडिंग अभी भी चल रही थी, और ओएस अनुसूचक हो सकता है सिगनलिंग के बाद एक घंटे के लिए सोने के लिए धागे को लगाने का फैसला करें ताकि प्राप्त अंत के लिए कोई रास्ता नहीं मिल सके।
यदि main()
थ्रेडेड थ्रेड के साथ रनिंग अपरिभाषित व्यवहार है, तो कोई भी उपयोग std::thread::detach()
अपरिभाषित व्यवहार है जब तक कि मुख्य धागा 2 से बाहर नहीं निकलता ।
इस प्रकार, main()
अलग-थलग चलने वाले थ्रेड के साथ चलने से परिभाषित प्रभाव पड़ने चाहिए । सवाल यह है: जहां ( C ++ मानक में , POSIX नहीं, ओएस डॉक्स नहीं, ...) उन प्रभावों को परिभाषित किया गया है।
2 एक अलग किया हुआ धागा शामिल नहीं किया जा सकता (अर्थ में std::thread::join()
)। आप अलग किए गए थ्रेड्स से परिणाम की प्रतीक्षा कर सकते हैं (उदाहरण के लिए भविष्य के माध्यम से std::packaged_task
, या एक गिनती सेमाफोर या एक ध्वज और एक स्थिति चर के द्वारा), लेकिन यह गारंटी नहीं देता है कि थ्रेड ने निष्पादन समाप्त कर दिया है । दरअसल, जब तक आप धागे की पहली स्वचालित वस्तु का नाशक में संकेतन हिस्सा रखा, वहाँ होगा , सामान्य रूप में, कोड (विनाशकर्ता) कि रन हो के बाद संकेत कोड। अगर ओएस परिणाम को भस्म करने के लिए मुख्य थ्रेड को शेड्यूल करता है और इससे पहले कि अलग किए गए थ्रेड खत्म होने से पहले बाहर निकलने के लिए विनाशकारी कहा जाता है, तो ^ क्या होने के लिए परिभाषित किया जाएगा?
std::exit
या बाहर निकलने के लिए हर धागे को समाप्तmain
करना पर्याप्त है, लेकिन आवश्यक नहीं है।" (पूरा पैराग्राफ प्रासंगिक हो सकता है) यह भी देखें [support.start.term] / 8 ( रिटर्न मिलने परstd::exit
बुलाया जाताmain
है)