2011-07-27 12 views
5

this प्रश्न के उत्तर के लिए खोज रहे हैं मुझे फ़ंक्शन _locking() मिला। वहां बताया गया है कि यह Locks or unlocks bytes of a file (असल में मैं समझ नहीं पा रहा हूं कि यह वाक्य वास्तव में क्या मतलब है)। अगर किसी को इस फ़ंक्शन का उपयोग करने का अनुभव है, तो क्या पहले प्रश्न में वर्णित समस्या को हल करने के लिए फ़ंक्शन का उपयोग करना संभव है?_locking() वास्तव में क्या करता है?

उत्तर

1

के हवाले से MSDN पेज आप लिंक किए गए:

int _locking(
    int fd, 
    int mode, 
    long nbytes 
); 

समारोह ताले _locking या nbytes fd द्वारा निर्दिष्ट फ़ाइल की बाइट्स बातें बताता है। किसी फ़ाइल में बाइट लॉक करना अन्य प्रक्रियाओं द्वारा उन बाइट्स तक पहुंच को रोकता है। सभी लॉकिंग या अनलॉकिंग फ़ाइल पॉइंटर की वर्तमान स्थिति से शुरू होती है और अगले nbytes बाइट्स के लिए आय प्राप्त होती है। फाइल के पिछले छोर बाइट लॉक करना संभव है।

+0

हां, मैंने इसे पढ़ा। लेकिन जब मैंने फ़ाइल को लॉक करने की कोशिश की है, तो मैं उसी प्रक्रिया में ऑफस्ट्रीम के माध्यम से फ़ाइल को नहीं लिख सका। तो बाइट्स के लिए लॉकिंग वास्तव में क्या मतलब है? –

+0

या शायद यह Win7 के लिए गलत तरीके से काम करता है? –

0

http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx

मैंने पाया कि इस मदद करता है "ठीक" समस्या Race condition!

फ़ाइल लिखने के लिए अंतिम व्यक्ति जीतता है। मान लें कि आपको फ़ाइल की पहली छमाही को पूरी फ़ाइल को लॉक करने का कोई कारण नहीं है।

तो आप बाइट्स में फ़ाइल आकार को इस फ़ंक्शन में पास करते हैं और फिर इसे लॉक करते हैं।

सफल होने पर फ़ंक्शन 0 लौटाएगा। -1 का रिटर्न वैल्यू विफलता को इंगित करता है, जिस स्थिति में एमएसडीएन पेज आपको जो बताता है उस पर इरनो सेट किया जाता है।

अपने प्रश्न

उत्तर देने के लिए आप फ़ाइल का आकार ले तो यह ताला लगा सकते हैं लेकिन आप केवल फ़ाइल के रूप में पढ़ने के लिए सक्षम हो जाएगा। आप इसे केवल एक तरह के पढ़ने मोड में बंद कर दें।

रेस की स्थिति की विकी में यह आपको उदाहरण देता है कि एक ध्वज की जांच करने के लिए दूसरी प्रक्रिया प्राप्त करके फ़ाइल को लॉक करने के उदाहरण यह आपके मामले में काम कर सकते हैं।

1

यह फ़ाइल लॉक प्राप्त करने वाली प्रक्रिया के विशेष उपयोग के लिए फ़ाइल की एक श्रृंखला को सुरक्षित रखता है। यदि लॉक कॉल सफल हो जाती है, तो दूसरी प्रक्रिया जो फ़ाइल के उस भाग को पढ़ने या लिखने का प्रयास करती है, विफल हो जाएगी। यह एकाधिक प्रक्रियाओं को एक ही फ़ाइल तक पहुंचने और इसे सुसंगत तरीके से अपडेट करने की अनुमति देता है। यह एक फ़ाइल की एक श्रृंखला के लिए एक mutex की तरह है।

असल में यह आपको परमाणु रूप से फ़ाइल के हिस्सों को अपडेट करने की अनुमति देता है, इसलिए फ़ाइल को पढ़ने या लिखने की कोई अन्य प्रक्रिया या तो सभी अपडेट, या इनमें से कोई भी नहीं देखेगी (या बदल जाएगी)। यह पढ़ने के लिए भी लागू होता है - आप उस फ़ाइल की एक श्रृंखला को लॉक कर सकते हैं जिसे आप पढ़ना चाहते हैं, ताकि आप इसे पढ़ने के बीच में एक और प्रक्रिया को बदलने से रोक सकें।

लेकिन प्रक्रियाएं अभी भी त्रुटि या देरी के बिना फ़ाइल के अन्य हिस्सों तक पहुंच सकती हैं।

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

+0

यह फ़ंक्शन फ़ाइल फ़ॉर्म को सभी लिखता है, और इसे केवल बाइट्स बनाने योग्य बनाता है। फ़ाइल आसानी से फ़ाइल में प्रवेश करने से पहले धागे की जांच करने के लिए ग्लोब को एक झंडा जोड़ सकता है। –

+0

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

+0

@ डेनिस: यह भी अनुमान न करें कि 'ध्वज जोड़ें' कितना आसान हो सकता है। यदि आप इंटर-थ्रेड एक्सेस फ़ाइल को फ़ाइल श्रेणियों के लिए ग्रेन्युलर करना चाहते हैं, तो आपको कुछ प्रकार की डेटा संरचना रखने की आवश्यकता है जो इंगित करता है कि कौन सी श्रेणियां लॉक हैं, और आपको उस डेटा तक पहुंच प्रबंधित करने के लिए सिंक्रनाइज़ेशन तंत्र (महत्वपूर्ण अनुभाग ऑब्जेक्ट्स या जो कुछ भी) की आवश्यकता है संरचना। यह ध्वज की जांच के रूप में तुच्छ नहीं है। साथ ही, आपको इसकी आवश्यकता होने पर हर जगह * एक्सेस चेक * स्पष्ट रूप से जोड़ना होगा। यदि आप सही समय पर चेक नहीं करते हैं, तो थ्रेड बी सीमा तक पहुंच जाएगा जबकि थ्रेड ए ने इसे 'लॉक' किया है। –

0

यह अन्य प्रक्रियाओं को फ़ाइल के उसी भाग तक पहुंचने से रोकता है।

+0

एक्सेसिंग में पढ़ने की पहुंच शामिल है? – smerlin

+0

@ स्मारकिन: हाँ; यह अनन्य है। – Mehrdad

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