प्रलेखन के अनुसार सुरक्षित रूप से थ्रेड में शामिल हों here और here के अनुसार, सी ++ 11 थ्रेड की जॉइन विधि को joinable() == false
फेंक देगी।सी ++ 11 कोशिश/पकड़ ब्लॉक
if (thread2.joinable()) thread2.join();
बहरहाल, यह संभावना एक std :: system_error फेंकने के लिए है: इस प्रकार प्राकृतिक तरीके से निष्पादन पूरा करने के लिए एक धागा के लिए प्रतीक्षा करने की तर्ज पर कुछ न कुछ है। थ्रेड 1 कॉल थ्रेड 2.जोइनबल() पर विचार करें, सत्य लौटाता है, यह दर्शाता है कि थ्रेड 2 अभी भी चल रहा है। फिर शेड्यूलर थ्रेड 1 को रोकता है और संदर्भ को थ्रेड पर स्विच करता है 2. थ्रेड 2 पूर्ण होता है, और फिर थ्रेड 1 फिर से शुरू होता है। थ्रेड 1 कॉल thread2.join(), लेकिन thread2 पहले से ही पूरा हो चुका है, और नतीजतन, std :: system_error फेंक दिया गया है।
try {
thread2.join();
catch (std::system_error &e) {}
लेकिन तब जब एक वैध std :: system_error फेंक दिया जाता है, संभवतः संकेत मिलता है कि धागा , में शामिल होने में विफल:
सम्भावित समाधान की कोशिश ब्लॉक में पूरी बात रैप करने के लिए है कार्यक्रम जारी है, अभिनय के रूप में सबकुछ ठीक और बेवकूफ है। क्या इस तरह एक कोशिश/पकड़ ब्लॉक का उपयोग करने के अलावा धागे में शामिल होने का कोई उचित तरीका है?
'जुड़ने योग्य' धागा अलग होने पर भी 'झूठी' वापस आ जाएगा। –
@ एडम: स्पष्टीकरण के लिए धन्यवाद कि "धागे से जुड़े नहीं" वास्तव में क्या मतलब है। –
'वापसी करें कि थ्रेड ऑब्जेक्ट वर्तमान थ्रेड का प्रतिनिधित्व करता है या थ्रेड से जुड़ा नहीं है' [joinable] (http://en.cppreference.com/w/cpp/thread/thread/joinable) चेक ** केवल ** एसोसिएशन एक थ्रेड के साथ, लेकिन वर्तमान धागे के साथ नहीं। ** लेकिन ** [शामिल] (http://en.cppreference.com/w/cpp/thread/thread/join) वर्तमान थ्रेड की जांच करेगा और 'system_error' की रिपोर्ट करेगा। [लाइव] (http://coliru.stacked-crooked.com/a/422f27866296efd0) उदाहरण। –