2012-07-12 25 views
13

समारोह pthread_create से बुलाया निम्नलिखित संरचनाpthread_exit इलिप्सिस द्वारा पकड़ा गया कुछ फेंक क्यों देता है?

try{ 
    ...code.... 
    pthread_detach(pthread_self()); 
    pthread_exit(NULL); 
}catch(...){ 
    std::cout<<"I am here"<<std::endl; 
} 

क्यों अंडाकार के लिए अपवाद संचालक pthread_exit के निष्पादन में कहा जाता हो जाता है है तो क्या होगा? (ध्यान दें कि std::exception, उदाहरण के लिए, फेंक दिया नहीं कर रहे हैं)

+0

आप इसे किस संकलक के अंतर्गत देख रहे हैं? –

+0

@ फ़ैबियो शायद ढेर पर किसी ऑब्जेक्ट का कुछ विनाशक फेंक रहा है। –

+0

@ डेव्स जी ++ टोरस्टेनरोबित्स्की धन्यवाद, मैं वही हूं, लेकिन मामला ईरान –

उत्तर

22

pthread_exit एक ___forced_unwind अपवाद फेंक सकता है, कि धागा बाहर निकलने के दौरान स्टैक के लिए प्रयोग किया जाता है। यह std::exception से प्राप्त नहीं होता है, और इसलिए इसे एक के रूप में नहीं पकड़ा जा सकता है।

try { 
... 
} catch (abi::___forced_unwind&) { 
    throw; 
} catch (...) { 
    // whatever 
} 

कारण एक अपवाद फेंका जाता है कि pthread_exit कभी नहीं निर्दिष्ट किया जाता है वापस जाने के लिए है: आपको लगता है कि अपवाद को पकड़ने करते हैं, throw यह फिर से करने के लिए सुनिश्चित तो यह अपना काम कर सकते हैं हो सकता है। इसे स्टैक-आवंटित चर के सफाई की गारंटी देता है, और इसके स्थान के बाद कोड का निष्पादन नहीं होता है (जब तक कि आप अनचाहे अपवाद नहीं लेते ...)।

बीटीडब्ल्यू, यह एक और मामला है जहां catch (...) मुहावरे अच्छा से ज्यादा नुकसान करता है। इसे कभी-कभी अज्ञात अपवादों को फेंकने वाले कोड को "स्थिर" करने के लिए उपयोग किया जाता है। लेकिन यह केवल बाद के समय और स्थान पर क्षति की दृश्यता को रोकता है, जिससे समस्या की वास्तविक उत्पत्ति को पहचानना असंभव हो जाता है। इस तरह के पकड़ में करने के लिए एकमात्र उचित बात न्यूनतम सफाई, संभवतः लॉगिंग, और फिर पुनर्स्थापना है। एक अनचाहे अपवाद के कारण क्रैश होने वाली एक प्रक्रिया एक सुंदर दृष्टि नहीं है, लेकिन यह एक डीबग करने योग्य क्रैश डंप प्रदान कर सकती है जो स्पष्ट रूप से दोषपूर्ण कमांड दिखाती है। लेकिन यह सिर्फ catch (...) के खिलाफ मेरी चिल्लाहट है, जो pthread_exit से मुश्किल से संबंधित है ...

+0

द्वारा समझाया गया था, आपको बहुत धन्यवाद, यह बिल्कुल मामला था! और मुझे लगता है कि आपका फेंक को रोकने के लिए है: अपवाद को पुनर्स्थापित नहीं किया गया धन्यवाद! –

+0

+1 बहुत रोचक! –

+1

@ फ़ैबियो: 'abi :: __ force_unwind अपवाद 'को थ्रेड में भी फेंक दिया जा सकता है जिसे' pthread_cancel' के साथ रद्द कर दिया गया है। Pthreads को समाप्त करते समय इलिप्सिस पकड़ से सावधान रहें। –

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