/ / DLLs में उपयोग किए जाने पर स्पिरिट क्रैश बूस्ट - c ++, बूस्ट, बूस्ट-थ्रेड, बूस्ट-स्पिरिट

डीएलएल में इस्तेमाल होने पर आत्मा दुर्घटना को बढ़ावा दें - सी ++, बूस्ट, बूस्ट-थ्रेड, बूस्ट-स्पिरिट

बूस्ट का उपयोग करते समय मैं एक दुर्घटना का सामना कर रहा हूं।आत्मा और बूस्ट मेरे आवेदन में पुस्तकालय। यह केवल तभी होता है जब मैंने आत्मा का उपयोग किया हो मुख्य थ्रेड से प्रक्रिया के जीवनकाल के दौरान पार्सर।

दुर्घटना निकास पर होती है और प्रतीत होती हैकी सफाई से संबंधित है थ्रेड विशिष्ट भंडारण आत्मा पार्सर द्वारा आवंटित। यह संभवतः अनुक्रम के कारण दुर्घटनाग्रस्त हो रहा है जिसके कारण DLL हैं अनलोड, चूंकि थ्रेड विशिष्ट मेमोरी को DLL के अंदर आवंटित किया गया है वह पहले ही अनलोड हो चुका है। Boost.Thread DLL को हालांकि अनलोड नहीं किया जाता है जब तक कि एप्लिकेशन स्वयं बाहर न निकल जाए।

क्या मेरे लिए आत्मा को अपने धागे को साफ करने के लिए मजबूर करने का एक तरीका है भंडारण, उदा। जब मैं एक प्रक्रिया-अलग सूचना प्राप्त करूँ तो अपने dll-main में?

किसी भी समाधान / संकेत की सराहना की जाएगी।

पुनश्च! मेरा मंच और सेटिंग्स:

  • विजुअल स्टूडियो 2005
  • BOOST_ALL_DYN_LINK
  • BOOST_SPIRIT_THREADSAFE

उत्तर:

जवाब के लिए 3 № 1

वैसे मुझे वर्कअराउंड मिला।

हर जगह मैं बढ़ावा :: भावना ::पार्स कॉल, मैं मूल रूप से इसे चलाने के लिए एक वर्करथ्रेड स्पॉन करता हूं, जबकि कॉलिंग थ्रेड वर्करथ्रेड के साथ एक कॉल पर रोक रहा है। आदर्श नहीं है, लेकिन यह अब तक बिना किसी पक्षपात के काम करता हुआ प्रतीत होता है।

अभी भी किसी भी विकल्प में दिलचस्पी है क्योंकि मेरी आंत की भावना यह है कि एक अलग धागा "वास्तव में जरूरत नहीं होना चाहिए"।


उत्तर № 2 के लिए 1

Boost.Spirit हेडर-ओनली है, यानी यह अपने स्वयं के dll में नहीं रहता है, इसलिए शायद यह dll का अनलोडिंग ऑर्डर नहीं है, बल्कि एक अलग मुद्दा है।

सुनिश्चित करें कि आपके स्पिरिट पार्सर वाले इंस्टेंस को हटा दिया गया है और लटकने वाले बिंदुओं को छोड़ना नहीं है।