2012-03-05 10 views
12

क्या मैं सुरक्षित रूप से समान निर्देशिका को दो अलग-अलग धागे से बनाने का प्रयास कर सकता हूं, उनमें से कोई एक अपवाद फेंकने के बिना, या अन्य मुद्दों में चलाया जा सकता है?सी # थ्रेड-सुरक्षित में CreateDirectory() है?

ध्यान दें कि MSDN के अनुसार, CreateDirectory() पर एक निर्देशिका पर कॉल करना ठीक है, जिस स्थिति में विधि को कुछ भी करने की उम्मीद नहीं है।

उत्तर

13

Directory.CreateDirectory कॉल स्वयं कई धागे से सुरक्षित है। यदि आप ऐसा करते हैं तो यह भ्रष्ट प्रोग्राम या फ़ाइल सिस्टम स्थिति नहीं करेगा।

हालांकि Directory.CreateDirectory पर कॉल करना संभव नहीं है, यह गारंटी देने के लिए कि यह अपवाद नहीं फेंक देगा। फाइल सिस्टम एक अप्रत्याशित जानवर है जिसे किसी भी समय आपके नियंत्रण के बाहर अन्य कार्यक्रमों द्वारा बदला जा सकता है। यह बहुत संभव है उदाहरण देखने के लिए के लिए निम्न स्थिति

  • कार्यक्रम 1 थ्रेड 1: कॉल c:\temp\foo के लिए CreateDirectory और यह
  • कार्यक्रम 2 धागा 1 सफल होता है: कार्यक्रम 1 उपयोगकर्ता
  • कार्यक्रम 1 थ्रेड से c:\temp के लिए उपयोग को निकालता है 2: CreateDirectory कॉल और अपर्याप्त पहुँच

की वजह से फेंकता है संक्षेप में आप यह मान लेना चाहिए कि Directory.CreateDirectory, या वास्तव में किसी भी समारोह जो फाइल सिस्टम को छू लेती है, और टी कर सकते हैं हरो और तदनुसार संभाल लें।

6

MSDN docs on Directory से:

किसी भी सार्वजनिक स्थिर इस प्रकार के सदस्यों (विजुअल बेसिक में साझा) धागा सुरक्षित हैं। किसी भी इंस्टेंस सदस्यों को थ्रेड सुरक्षित होने की गारंटी नहीं है।

इसलिए, जैसा कि CreateDirectory स्थिर है, हां, यह थ्रेड सुरक्षित है।

ने कहा कि: @JaredPar बताते हैं, थ्रेड सुरक्षा समस्याएं एकमात्र कारण नहीं हैं कि एक विधि अपवाद फेंक सकती है। फाइल सिस्टम सिस्टम एक अपवाद फेंक सकता है (किसी भी परिस्थिति में, बहुप्रचारित या नहीं) के कई कारण हैं, और आपको उन लोगों के लिए जिम्मेदार होना चाहिए।

यह कहकर कि यह थ्रेड सुरक्षित है (और एमएसडीएन) केवल उसमें की शाब्दिक व्याख्या का अर्थ है, जिसका अर्थ है "यह विधि साझा प्रोग्राम स्थिति को इस तरह से संशोधित नहीं करती है जिससे अमान्य स्थिति, जाति की स्थिति या अन्य प्रतिकूल प्रभाव हो सकते हैं आमतौर पर असुरक्षित मल्टीथ्रेड कोड से जुड़े "

+0

यह समस्या का समाधान नहीं करता की हालांकि चाहे या नहीं यह एक या दोनों धागे – JaredPar

+0

से फेंक देते हैं True- मेरा मानना ​​है कि अपने जवाब को शामिल किया गया है कि बेहतर (मैं btw upvoted)। मैं अपना जवाब संशोधित करूंगा। –

4

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

हालांकि, यदि दूसरा कॉल ओएस तक पहुंचता है, जबकि यह अभी भी पहले प्रोसेस कर रहा है, तो ओएस मुद्दों को लॉक करने के लिए दूसरी एक डुबकी विफल हो सकता है, और आपको अपवाद मिलेगा।

यह अभी भी इस धागे में सुरक्षित है कि आपको कोई अप्रत्याशित फ़ोल्डर्स नहीं बनाया जाएगा, या बिल्कुल कोई फ़ोल्डर नहीं होगा।

विस्तृत करने के लिए - जबकि मुझे 100% यकीन नहीं है कि विंडोज़ में आंतरिक दौड़ की स्थिति नहीं है जब एक ही फ़ोल्डर दो बार समेकित रूप से बनाया जाता है, तो मुझे यकीन है कि आप डिस्क को कचरा नहीं कर पाएंगे ऐसा करना, या मृत्यु के लिए फंसे दोनों रचनाओं के साथ एक डेडलॉक प्राप्त करें। उनमें से एक सफल होगा, दूसरा असफल हो जाएगा, लेकिन फ़ोल्डर बनाया जाएगा।

तो अपने शोध प्रणालियों, बस पूरी तरह से सुनिश्चित हो सकता है, यह होना चाहिए:

  • निर्देशिका
  • बनाएं यदि यह विफल रहता है, समय की एक यादृच्छिक राशि इंतजार (जैसे कि, 0.2 और एक दूसरे के 0.5 के बीच) और फिर प्रयत्न करें।
  • तो यह लगातार विफल रहता है (जैसे कि, एक पंक्ति में 3 बार), आप अपने हाथों पर एक और समस्या है - संयोग से फ़ोल्डर, एक पूर्ण डिस्क, आदि के लिए कोई अनुमति ..

    , क्यों फ़ोल्डर नहीं बना एक बार जब एप्लिकेशन चलना शुरू हो जाता है?

+0

क्या आप इस बारे में निश्चित हैं? मेरा इरादा एक ही निर्देशिका में कई अलग-अलग धागे बनाने (अलग) लॉग फ़ाइलों को बनाना था, यदि आवश्यक हो तो इसे बनाना। मान लें कि आप सही हैं, और फ़ोल्डर निर्माण एक परमाणु ऑपरेशन नहीं है, मुझे इसे सिंक्रनाइज़ करने के लिए एक लॉक (उदा।) का उपयोग करना होगा। CreateDirectory() के बारे में "थ्रेड-सुरक्षित" क्या है? – bavaza

+0

मैं विस्तृत करूंगा। – zmbq

+0

धन्यवाद। मुझे लगता है कि यह वह व्यवहार हो सकता है जिसे मैं देख रहा हूं। –

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