2009-04-11 14 views
11

मैं डेल्फी 200 9 में एक सर्वर एप्लीकेशन लिख रहा हूं जो कई प्रकार के प्रमाणीकरण को लागू करता है। प्रत्येक प्रमाणीकरण विधि एक अलग डीएल में संग्रहीत किया जाता है। पहली बार एक प्रमाणीकरण विधि का उपयोग किया जाता है उचित डीएल लोड किया जाता है। डीएल केवल तभी जारी किया जाता है जब एप्लिकेशन बंद हो जाता है।क्या एक ही आवेदन में एकाधिक धागे से एक डीएलएल समारोह को कॉल करना सुरक्षित है?

यह सर्वर धागे (कनेक्शन) के बीच तुल्यकालन के किसी भी रूप के बिना DLLs उपयोग करने के लिए सुरक्षित है?

उत्तर

17

लघु जवाब:

हाँ, यह आम तौर पर संभव के बाद से हर धागा यह खुद ढेर और एक DLL फ़ंक्शन को कॉल है है, एक से अधिक थ्रेड से एक DLL फ़ंक्शन को कॉल करने के लिए है और अधिक या कम एक ही किसी अन्य को कॉल करने जैसा है अपने कोड का कार्य

लांग जवाब:

यदि यह है वास्तव में संभव का उपयोग कर एक परिवर्तनशील राज्य या नहीं साझा DLL कार्यों पर निर्भर करता है।

उदाहरण के लिए यदि आप कुछ इस तरह करते हैं:

DLL_SetUser(UserName, Password) 
if DLL_IsAuthenticated then 
begin 
... 
end; 

तो यह सबसे निश्चित रूप से सुरक्षित नहीं अलग धागे से इस्तेमाल किया जा रहा है। इस उदाहरण में आप गारंटी नहीं दे सकते कि DLL_SetUser और DLL_IsAuthenticated के बीच कोई अन्य धागा DLL_SetUser पर एक अलग कॉल करता है।

लेकिन यदि डीएलएल फ़ंक्शन किसी प्रकार की पूर्वनिर्धारित स्थिति पर निर्भर नहीं हैं, यानी सभी आवश्यक पैरामीटर एक साथ उपलब्ध हैं और सभी अन्य कॉन्फ़िगरेशन सभी थ्रेड के लिए समान हैं, तो आप मान सकते हैं कि यह काम करेगा।

if DLL_IsAuthenticated(UserName, Password) then 
begin 
... 
end; 

लेकिन सावधान रहें: यह एक DLL समारोह परमाणु दिखता है, लेकिन आंतरिक रूप से यह संभव हो सकता है कुछ है, जो नहीं है का उपयोग करता है। उदाहरण के लिए यदि डीएलएल हमेशा एक ही नाम के साथ एक अस्थायी फ़ाइल बनाता है या यह डेटाबेस तक पहुंचता है जो एक समय में केवल एक अनुरोध को संभाल सकता है, तो यह एक साझा स्थिति के रूप में गिना जाता है। (माफ करना, मैं बेहतर उदाहरण के बारे में सोच नहीं सकता था)

सारांश:

तो DLL विक्रेताओं का कहना है, कि उनके DLLs धागा सुरक्षित हैं मैं उन्हें एक से अधिक थ्रेड से ताला लगा के बिना उपयोग करेंगे। यदि वे नहीं हैं - या यहां तक ​​कि यदि विक्रेताओं को पता नहीं है - आपको इसे सुरक्षित और लॉकिंग का उपयोग करना चाहिए।

कम से कम जब तक आप प्रदर्शन समस्याओं में भाग नहीं लेते। उस स्थिति में आप कई अनुप्रयोग/प्रक्रियाएं बनाने का प्रयास कर सकते हैं जो आपके डीएलएल कॉल को लपेटते हैं और उन्हें प्रॉक्सी के रूप में उपयोग करते हैं।

+1

एक और उदाहरण एक आंतरिक डेटा संरचना हो सकती है जहां निर्यात किए गए फ़ंक्शंस तत्वों को जोड़ते हैं और/या हटाते हैं - जैसे (विफल) प्रमाणीकरण अनुरोधों की सूची, या प्रमाणित उपयोगकर्ताओं की एक सूची। – mghie

-1

आप Win32 DLLs के बारे में बात करते हैं, वे यदि एक से अधिक थ्रेड से बुलाया सुरक्षा के लिए, अनुप्रयोगों का मतलब कर रहे हैं। मुझे नहीं पता कि आपका डीएलएल क्या करता है, लेकिन यदि आपका डीएलएल फाइल या पोर्ट जैसे लॉक करने योग्य संसाधन का उपयोग कर रहा है, तो डीएलएल के अंदर कार्यान्वयन के आधार पर परेशानी हो सकती है।

मैं डेल्फी 2009 प्रमाणीकरण DLLs की कार्यप्रणाली से परिचित नहीं हूँ। हो सकता है कि आपको उस जानकारी को शीर्षक में जोड़ना चाहिए (कि आप विशेष रूप से डेल्फी 200 डीएलएल के बारे में बात कर रहे हैं)

+0

Win32 DLLs कोई भी DLLs है जिसे Win32 में लोड किया जा सकता है। शायद आप "विंडोज सिस्टम डीएलएल" के बजाय मतलब था? इसके अलावा, डेल्फी 200 में "प्रमाणीकरण डीएलएल" जैसी कोई चीज़ नहीं है। ये किसी तरह के तीसरे पक्ष के डीएलएल होना चाहिए। –

4

अपने डीएलएल के लिए थ्रेड-सुरक्षित होने के लिए आपको सभी साझा डेटा संरचनाओं की रक्षा करने की आवश्यकता है जो एक प्रक्रिया में एकाधिक थ्रेड एक्सेस कर सकते हैं समवर्ती रूप से - एक निष्पादन योग्य के लिए एक डीएलएल बनाम लेखन कोड के लिए कोड लिखने के बीच कोई अंतर नहीं है।

कई प्रक्रियाओं के लिए वहाँ समवर्ती पहुँच में कोई खतरा नहीं, के रूप में प्रत्येक प्रक्रिया DLL के लिए अपने स्वयं के डेटा खंड हो जाता है, इसलिए एक ही नाम के साथ चर वास्तव में अलग है जब विभिन्न प्रक्रियाओं से देखा जाता है। डीएलएल में डेटा प्रदान करना वास्तव में बहुत मुश्किल है जो विभिन्न प्रक्रियाओं से समान है, आपको मूल रूप से उन चीजों को लागू करने की आवश्यकता होगी जो आप प्रक्रियाओं के बीच डेटा एक्सचेंज के लिए उपयोग करेंगे।

ध्यान दें कि एक DLL कि जब एक प्रक्रिया या एक धागा से जुड़ जाता है या एक DLL से अलग हो जाता है तो आपको सूचनाएं प्राप्त में विशेष है। एक स्पष्टीकरण के लिए DllMain Callback Function के लिए प्रलेखन देखें, और this article उदाहरण के लिए डेल्फी-लिखित डीएलएल में इसका उपयोग कैसे करें। इसलिए यदि आपके धागे एक दूसरे से पूरी तरह से स्वतंत्र नहीं हैं (और कोई साझा डेटा लिखने योग्य नहीं है), तो आपको सिंक्रनाइज़ पहुंच के साथ कुछ साझा डेटा संरचनाओं की आवश्यकता होगी। विभिन्न सूचनाएं आपके डीएलएल में किसी भी डेटा संरचना को व्यवस्थित करने में आपकी सहायता कर सकती हैं।

अपने DLLs निर्यात कार्यों की पूरी तरह से स्वतंत्र निष्पादन के लिए अनुमति देते हैं, भी threadvar धागे की विशिष्ट चरों की जाँच करें। ध्यान दें कि उनके लिए प्रारंभ और अंतिम रूप दिए जाने वर्गों प्रयोग करने योग्य नहीं हैं, लेकिन हो सकता है धागा सूचनाएं तुम वहाँ मदद के रूप में अच्छी तरह से कर सकते हैं।

0

यहां बात है - आप यह नहीं मान सकते कि यदि आपके पास स्रोत कोड (या यह बताते हुए प्रलेखन) पर नियंत्रण नहीं है तो DLL के थ्रेड सुरक्षित हैं इसलिए इसलिए उन्हें सबसे खराब माना जाता है।

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