2009-03-12 13 views
5

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

हाथ पर pthread_cancel पीपीसी के साथ व्यवहार नहीं करता है। थ्रेड रद्द हो जाता है लेकिन थ्रेड के स्थानीय चर के लिए विनाशक को हाथ पर नहीं बुलाया जा रहा है। मैंने pthread_cleanup_push के माध्यम से स्थापित रद्दीकरण क्लीनअप हैंडलर रूटीन को स्पष्ट रूप से परिभाषित करने का भी प्रयास किया। लेकिन धागा रद्द होने पर इसे नहीं कहा जा रहा है।

कोड पीपीसी के साथ ठीक काम करता है। जब एक धागा रद्द कर दिया जाता है, तो स्थानीय चर के विनाशक को बुलाया जा रहा है। और जब मैंने स्पष्ट रूप से क्लीनअप हैंडलर को परिभाषित किया, तो इसे pthread_cancel कहा जाता था जब इसे बुलाया और निष्पादित किया गया था।

क्या मुझे कुछ याद आ रही है? शायद कुछ कंपाइलर विकल्प?

  • प्रोग्रामिंग भाषा: सी ++
  • संकलनकर्ता: हाथ-linux-जी ++/PowerPC-linux-जी ++
  • ओएस: लिनक्स

संपादित करें:

मैं एक तरह से मिल गया है इस समस्या को libc bug पर लॉग ऑन किया गया।

जी ++ के बजाय जीसीसी का उपयोग करना और जोड़ने -फनो-अपवाद कंपाइलर विकल्प ने चाल की। लेकिन मैं वास्तव में इस मुद्दे के पीछे सामान समझना चाहता हूं। इसके अलावा, -फनो-अपवाद का अर्थ है कि मैं अपने आवेदन में अपवाद हैंडलिंग करने में सक्षम नहीं हूं, न कि मैं अब इसका उपयोग कर रहा हूं लेकिन मैं भविष्य में हो सकता हूं।

धन्यवाद।

+0

कृपया भाषा और compilers (दोनों प्लेटफार्मों के लिए) का उपयोग किया निर्दिष्ट करें। यह सी ++ की तरह लगता है, लेकिन यह स्पष्ट होना बेहतर है। – unwind

+0

यह यह जानने में भी मदद करेगा कि कौन सा ओएस पाथ्रेड पैकेज अक्सर ओएस विशिष्ट है। – Benoit

+0

मैं लिनक्स कर्नेल के सटीक संस्करण को सूचीबद्ध करने का भी सुझाव दूंगा, जो प्रत्येक मामले में उपयोग किए जाने वाले प्लेटफ़ॉर्म समर्थन को लक्षित करता है, और जीसीसी/जी ++, libc, और शामिल किसी अन्य सॉफ़्टवेयर के संस्करण। सटीक संस्करण संख्याओं के बिना अच्छी सलाह के साथ आना बहुत मुश्किल है। – jakobengblom2

उत्तर

2

आवेदन से सहायता के बिना थ्रेड रद्दीकरण एक बुरा विचार है। बस google। थ्रेड द्वारा आवधिक रूप से चेक किए जाने वाले फ्लैग वेरिएबल को सेट करके थ्रेड को स्वयं समाप्त करने के लिए यह बेहतर होता है।

वास्तव में रद्दीकरण इतना कठिन है कि इसे नवीनतम सी ++ 0x ड्राफ्ट से छोड़ा गया है। आप http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html खोज सकते हैं और उन्हें रद्दीकरण का कोई भी उल्लेख नहीं मिलेगा। यहाँ प्रस्तावित धागा वर्ग की परिभाषा है (आप को रद्द मिलेगा नहीं):

class thread 
{ 
public: 
    // types: 
    class id; 
    typedef implementation-defined native_handle_type; // See [thread.native] 

    // construct/copy/destroy: 
    thread(); 
    template <class F> explicit thread(F f); 
    template <class F, class ...Args> thread(F&& f, Args&&... args); 
    ~thread(); 
    thread(const thread&) = delete; 
    thread(thread&&); 
    thread& operator=(const thread&) = delete; 
    thread& operator=(thread&&); 

    // members: 
    void swap(thread&&); 
    bool joinable() const; 
    void join(); 
    void detach(); 
    id get_id() const; 
    native_handle_type native_handle(); // See [thread.native] 

    // static members: 
    static unsigned hardware_concurrency(); 
}; 
+0

मैं इस तरह कुछ के लिए बस गया। मैंने बस pthread_cancel से दूर रहने और यह सब गड़बड़ लाने का फैसला किया। मैंने अभी थ्रेड की स्थिति को दर्शाते हुए एक ध्वज चर जोड़ा और रद्दीकरण बिंदु के रूप में नामित कुछ क्षेत्रों पर राज्य की जांच की। मैंने आई/ओ कॉल अवरुद्ध करने से तोड़ने के लिए एक सिगिनट भी भेजा। इस तरह से मैं रद्दीकरण बिंदुओं के रूप में पूर्ण नियंत्रण रखूंगा और धागा हर समय स्वच्छ और कृपापूर्वक समाप्त करने में सक्षम होगा। धन्यवाद! –

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