2012-08-17 15 views
5

मैं सी में एक साझा लाइब्रेरी लिख रहा हूं। मुझे पता है कि सी फ़ंक्शन थ्रेड सुरक्षित नहीं हैं।एक सी लाइब्रेरी थ्रेड सुरक्षित बनाना

मेरे पुस्तकालय दिनचर्या लग रहा है हर विधि lib_handle वस्तु के लिए एक सूचक लेता है की तरह,

struct lib_handle { 
.... 
}; 

int lib_init(lib_handle **handle); 
int lib_process(lib_handle *handle); 
.... 
.... 

। सभी राज्य इस संरचना के अंदर संग्रहीत हैं। कोई वैश्विक चर का उपयोग नहीं किया जाता है।

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

मैंने अभी तक इस धारणा को मान्य नहीं किया है। मैं सोच रहा हूं कि आप इस डिजाइन के बारे में क्या सोचते हैं और क्या आप बात करते हैं कि मैं अपनी लाइब्रेरी को थ्रेड सुरक्षित के रूप में बता सकता हूं कि प्रत्येक धागे के पास हैंडल हैं?

कोई भी मदद महान होगी!

+0

यह लाइब्रेरी SQLite के अलावा किसी भी पुस्तकालय का उपयोग नहीं कर रही है। SQLite स्वयं धागा सुरक्षित है। –

+0

हे, +1, आखिर में एक समझदार सवाल। –

उत्तर

3

इससे पुस्तकालय धागे का डेटा/राज्य सुरक्षित हो जाएगा।

लेकिन आपको यह भी सुनिश्चित करना होगा कि आपकी लाइब्रेरी अन्य पुस्तकालयों से थ्रेडसेफ फ़ंक्शंस का उपयोग करे, उदा। strtok के बजाय strtok_r का उपयोग करें।

+0

हाँ। तुम सही हो। मानक पुस्तकालय कार्यों के अन्य कार्यों के बारे में क्या? –

+0

@Appu अधिकतर मानक फ़ंक्शन थ्रेड-सुरक्षित होते हैं जब तक कि अन्यथा न कहा जाए। सबसे अच्छा तरीका फ़ंक्शन के मैन पेज को देखना है। – Rohan

1

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

0

यदि प्रत्येक थ्रेड में निजी lib_handle ऑब्जेक्ट होता है तो आपकी लाइब्रेरी पूरी तरह से थ्रेडसेफ होनी चाहिए; यदि आप कई थ्रेड्स को lib_handle ऑब्जेक्ट्स साझा करते हैं, तो आपकी लाइब्रेरी का उपयोग करने वाले व्यक्ति अभी भी मेगा थ्रेड सुरक्षित प्रोग्राम कर सकते हैं यदि वह आपकी लाइब्रेरी का सही तरीके से उपयोग करती है (यानी आपकी लाइब्रेरी स्वाभाविक रूप से थ्रेड-असुरक्षित नहीं है, तो यह होगा यदि आप ग्लोबल वैरिएबल का इस्तेमाल करते हैं)।

यदि ऑपरेशन का यह तरीका (साझा lib_handle) दिलचस्प है तो आपको उन कार्यों को स्पष्ट रूप से अलग करना चाहिए जो केवल lib_handle की स्थिति को पढ़ते हैं और जो lib_handle की स्थिति में हेरफेर करते हैं। पूर्व को एक पठन लॉक की आवश्यकता होती है और बाद में एक लिखने की ताला की आवश्यकता होती है (कॉलिंग स्कोप को इसे संभालना चाहिए)।

इसके लायक होने के लिए मैंने आपके द्वारा वर्णित पैटर्न का उपयोग किया है, और इसकी तरह।

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