2012-11-15 13 views
6

मैं boost::interprocess::file_lock का उपयोग करने के लिए सुनिश्चित करें कि फ़ाइलें जो प्रक्रिया P1 द्वारा एक निर्देशिका x के लिए लिखा जाता प्रक्रिया P2 द्वारा पढ़ा नहीं कर रहे हैं, जब तक वे पूरी तरह से कर रहे हैं चाहते हैं। ऐसा करने के लिए, मैं P1boost::interprocess::file_lock के साथ फ़ाइलों को लॉक करना चाहता हूं, जबकि उन्हें लिख रहा है, और फिर इसे पूरा होने पर अनलॉक करना चाहते हैं। फिर P2 लॉक होने वाली किसी भी फाइल को छोड़कर (और वापस आ सकता है) छोड़ सकता है।बढ़ावा साथ एक बंद फ़ाइल बनाएँ :: इंटरप्रोसेस :: file_lock

मेरी समस्या यह है कि ऐसा लगता है कि boost::interprocess::file_lock केवल आपको मौजूद फ़ाइलों को लॉक करने देता है। लेकिन अगर मैं पहली फ़ाइल बनाते हैं और फिर यह ताला, फिर वहाँ एक रेस स्थिति जहां है:

  1. P1 फ़ाइल
  2. P2 फ़ाइल देखती है बनाता है और पढ़ने यह
  3. P1 फ़ाइल ताले शुरू होता है
  4. P1 कुछ डेटा
  5. P2 कुछ डेटा पढ़ता है, अंत तक पहुंच जाता है, और P1 के आउटपुट के केवल एक हिस्से के साथ समाप्त होता है।

तो मैं जो करना चाहता हूं वह एक फाइल बना रहा है और इसे जितनी जल्दी बनाया गया है उसे बंद कर दिया गया है। boost::interprocess::file_lock का उपयोग करके ऐसा करने का कोई तरीका है?

उत्तर

1

नहीं। लेकिन एक कामकाज है जो केवल एक अतिरिक्त खाली फ़ाइल का उपयोग करता है।

पी 2 कभी भी फ़ाइलों के लिए स्कैन करने का प्रयास करने से पहले, एक नाम के साथ एक खाली फ़ाइल बनाएं जो पी 1 और पी 2 दोनों के लिए अच्छी तरह से जाना जाता है। P2 स्कैनिंग शुरू करने से पहले यह उस खाली फ़ाइल को लॉक कर देगा और जब यह निर्देशिका स्कैनिंग किया जाता है तो लॉक को रिलीज़ कर देगा (यानी फाइलों से डेटा में पढ़ने के दौरान इसे लॉक नहीं रखना चाहिए)। P1 एक नई फ़ाइल बनाता है इससे पहले कि वह खाली फ़ाइल लॉक कर देगी और नई फ़ाइल बनाई गई है, और लॉक होने के बाद लॉक को रिलीज़ कर देगा।

3

आप बूस्ट :: इंटरप्रोसेस :: file_lock के उद्देश्य को गलत समझते हैं, जब आप विधि boost :: interprocess :: file_lock test_lock ("my_file") का उपयोग करके file_lock बनाते हैं, तो आप फ़ाइल को "my_file" को पढ़ने/अन्य प्रक्रियाओं द्वारा
लिखना, आप बस घोषणा करते हैं कि आपके पास एक लॉक है जो फ़ाइल "my_file" के संदर्भ में है, यदि अन्य प्रक्रियाओं में एक ही फ़ाइल के संदर्भ में ताले हैं, तो आप इन ताले के बीच पारस्परिक बहिष्करण लागू कर सकते हैं, लेकिन इन ताले डॉन 'टी फ़ाइल "my_file" पर पढ़ें/लिखें आपरेशन के बारे में परवाह, फ़ाइल सिर्फ एक झंडा

0

मुझे लगता है कि इस प्रकार है कि कैसे आप से बचने के लिए रेस स्थिति है सक्षम होना चाहिए है:

  1. पी 1 फ़ाइल बनाता है
  2. पी 2 फ़ाइल को नोटिस करता है: ए। इसे ताला लगा देता है और बी। इसे पढ़ना शुरू होता है
  3. पी 1 फ़ाइल पर लॉक प्राप्त करने का प्रयास करता है, प्रतीक्षा करनी है।
  4. पढ़ना पूर्ण P2, फ़ाइल
  5. P1 फ़ाइल ताले
  6. P1 बातें बताता है कुछ डेटा
  7. लिखते

मुझे पता है कि अगर स्पष्ट नहीं है करते हैं।

धन्यवाद,

मोहित

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