2013-04-14 7 views
9

प्रलेखन के अनुसार सुरक्षित रूप से थ्रेड में शामिल हों 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 फेंक दिया जाता है, संभवतः संकेत मिलता है कि धागा , में शामिल होने में विफल:

सम्भावित समाधान की कोशिश ब्लॉक में पूरी बात रैप करने के लिए है कार्यक्रम जारी है, अभिनय के रूप में सबकुछ ठीक और बेवकूफ है। क्या इस तरह एक कोशिश/पकड़ ब्लॉक का उपयोग करने के अलावा धागे में शामिल होने का कोई उचित तरीका है?

उत्तर

10

joinable ऐसा नहीं करता जो आपको लगता है कि ऐसा करता है। सभी यह वापस आ गया है कि थ्रेड ऑब्जेक्ट थ्रेड से संबद्ध नहीं है या नहीं। हालांकि, thread::join विफल हो जाएगा यदि थ्रेड ऑब्जेक्ट वर्तमान थ्रेड का भी प्रतिनिधित्व करता है। इसलिए thread::join के लिए joinable की कमी के कारण विफल होने का एकमात्र कारण यह है कि यदि आप अपने साथ शामिल होने का प्रयास करते हैं।

पूरा धागा (जो स्वयं नहीं है) अभी भी पूरी तरह से जुड़ने योग्य है।

+3

'जुड़ने योग्य' धागा अलग होने पर भी 'झूठी' वापस आ जाएगा। –

+1

@ एडम: स्पष्टीकरण के लिए धन्यवाद कि "धागे से जुड़े नहीं" वास्तव में क्या मतलब है। –

+1

'वापसी करें कि थ्रेड ऑब्जेक्ट वर्तमान थ्रेड का प्रतिनिधित्व करता है या थ्रेड से जुड़ा नहीं है' [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) उदाहरण। –