2011-12-12 16 views
8

के साथ ट्रू मल्टीथ्रेडिंग मैं एक बहु थ्रेडेड सी ++ डीएलएल का परीक्षण करने की कोशिश कर रहा हूं। यह डीएलएल थ्रेड-सुरक्षित होना चाहिए। मैंने इसे boost.python से लपेट लिया है, और मैं boost.python wrapper के माध्यम से DLL का उपयोग करने के लिए एकाधिक पायथन थ्रेड बनाना चाहता हूं। मैं वास्तव में को थ्रेडिंग समस्याओं का कारण बनने की कोशिश कर रहा हूं।boost.python

मुझे अच्छा प्रलेखन प्रतीत नहीं होता है कि क्या पाइथन दुभाषिया अपने दो धागे (अलग-अलग कोरों पर कहता है) को एक आयातित मॉड्यूल में एक साथ कॉल करने का समर्थन करेगा, और क्या जीआईएल को सभी को ध्यान देने की जरूरत है मैं डीएलएल को जो प्रदान करना चाहता हूं उससे ऊपर कोई भी अतिरिक्त सुरक्षा नहीं चाहता हूं।

क्या कोई मुझे कई धागे से डीएलएल मॉड्यूल को कॉल करने वाले पाइथन के विवरण का वर्णन कर सकता है और इस मामले में जीआईएल का उपयोग कैसे किया जा सकता है?

+0

स्पष्ट रूप से आपको अपने आप को जीआईएल जारी करना होगा, अन्यथा आपके पास एक समय में एक से अधिक धागे चलेंगे। Http://stackoverflow.com/questions/1576737/releasing-python-gil-in-c-code – lvella

+1

देखें यह http://stackoverflow.com/questions/8009613/ का डुप्लिकेट है? –

+0

एक साइड सवाल: यदि मैं जीआईएल जारी नहीं करता हूं, और पायथन से बुलाया गया सी ++ कोड थ्रेड बनाता है, तो क्या यह थ्रेड पिन पायथन कोड सुरक्षित रूप से या नहीं कर सकता है। मुझे लगता है कि यह एक दुर्घटना की व्याख्या नहीं होगी ... – MatthieuW

उत्तर

1

जवाब नहीं है, गिल होगा कभी नहीं वास्तव में बहु धागा जब तक DLL मैन्युअल अवरोध समाप्त। पायथन एक समय में एक थ्रेड को चलाने की इजाजत देता है जब तक कि एक्सटेंशन मैन्युअल रूप से कहता है, "मैं अवरुद्ध हूं, मेरे बिना आगे बढ़ता हूं।" यह आमतौर पर Py_BEGIN_ALLOW_THREADS मैक्रो (और Py_END_ALLOW_THREADS के साथ पूर्ववत) के साथ किया जाता है जिसे पायथन के शामिल/ceval.h में परिभाषित किया जाता है। एक बार एक्सटेंशन होने के बाद, पायथन एक और धागे को चलाने की अनुमति देगा, और पहले धागे किसी भी पायथन सामग्री को करने से समस्याएं हो सकती हैं (टिप्पणी प्रश्न नोट्स के रूप में।) यह वास्तव में आई/ओ को अवरुद्ध करने या भारी गणना समय में जाने के लिए है।

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