2011-09-27 16 views
5

मैं सी ++ में कोड लिख रहा हूं। क्या मैं किसी भी तरह की दौड़ की स्थिति या सीजी-दोषों में भाग सकता हूं?क्या कई धागे एक साथ फाइल में लिख सकते हैं, यदि सभी धागे विभिन्न स्थानों पर लिख रहे हैं?

+2

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

उत्तर

6

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

आपको उस फाइल सिस्टम में विशेष सी ++ इंटरफ़ेस की थ्रेड-सुरक्षा की भी जांच करनी है जिसका आप उपयोग कर रहे हैं। अंतर्निहित फाइल सिस्टम की थ्रेड-सुरक्षा के अतिरिक्त इसकी आवश्यकता है।

आपको यह भी विचार करना चाहिए कि थ्रेडेड I/O धीमा हो जाएगा। सिस्टम को बस तक पहुंच को क्रमबद्ध करना पड़ सकता है। आप उत्पादक/उपभोक्ता पाइपलाइन के माध्यम से ओवरलैप किए गए I/O या समर्पित I/O थ्रेड से बेहतर प्रदर्शन प्राप्त कर सकते हैं।

+0

प्रत्येक धागे में मैं एक ही फाइल खोल रहा हूं और फिर प्रत्येक थ्रेड के लिए अलग स्थिति के अनुसार फ़ाइल में लिख रहा हूं। तो, मैं आगे बढ़ सकता हूं और सही कार्यान्वित कर सकता हूं ??? – Invictus

+0

मैं निश्चित रूप से नहीं कह सकता था। आपने अपना कोड नहीं दिखाया है। लेकिन जब तक आपके पास अलग-अलग हैंडल हों तो आपको ठीक होना चाहिए। –

1

निश्चित रूप से आप कर सकते हैं। रेस हालत इस बात पर निर्भर करती है कि आप वास्तविक कोड कैसे लिख रहे हैं (यानी उस फ़ाइल का उपयोग करना)। इसके अलावा, अगर IO buffered अजीब चीजें दिखाई दे सकती हैं तो buffered क्षेत्रों ओवरलैप हो सकता है।

2

यह निर्भर करता है। फ़ाइलें उनके हैंडल नहीं हैं, और स्ट्रीम फ़ाइलें नहीं हैं। यह तीन अलग-अलग अवधारणा स्पष्ट होनी चाहिए।

अब, ऑपरेटिंग सिस्टम फ़ाइल को विभिन्न हैंडल लौटने पर अधिक बार खोल सकता है, जिनमें से प्रत्येक का अपना "स्थिति सूचक" होता है। अगर फ़ाइल पढ़ने और लिखने दोनों के लिए "शेयर मोड" में खोला गया है, तो आप जहां चाहें हैंडल ढूंढ सकते हैं और पढ़ सकते हैं/लिख सकते हैं। तथ्य यह है कि आप ओवरराइट नहीं करते हैं आप पर निर्भर करता है। यह प्रणाली पूरी फाइल के लिए या इसके हिस्से के लिए परिचालन की अनुक्रमिकता प्रदान करती है (लेकिन ऑपरेटिंग सिस्टम पर अधिक जानकारी आवश्यक है)

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

+0

प्रत्येक धागे में मैं एक ही फाइल खोल रहा हूं और फिर प्रत्येक थ्रेड के लिए अलग स्थिति के अनुसार फ़ाइल में लिख रहा हूं। तो, मैं आगे बढ़ सकता हूं और सही कार्यान्वित कर सकता हूं ??? – Invictus

+0

@Invictus: आपको साझा करने के लिए फ़ाइल खोलनी होगी। बाकी सब कुछ काम करना चाहिए। –

4

फ़ाइल के आकार और जिस सिस्टम पर आप चल रहे हैं, उसके आधार पर एक और समाधान memory mapped files, यानी उपयोग करना है। फ़ाइल को वर्चुअल मेमोरी में मैप करना। यह आपको फ़ाइल तक सीधे पहुंच प्रदान करेगा जैसे कि यह स्मृति का एक टुकड़ा था। इस तरह, किसी भी संख्या में थ्रेड बस मेमोरी क्षेत्र को लिख सकते हैं और मैपिंग को डिस्क पर फ्लैश करने के लिए बाद में कॉल (मेमोरी मैपिंग की आपकी कॉन्फ़िगरेशन के आधार पर) डिस्क पर डेटा को स्टोर करेगा।

ध्यान दें, 32 बिट प्लेटफॉर्म पर प्रतिबंध लगाने के कारण, आर्किटेक्चर और वर्चुअल करने के लिए उपलब्ध बिट्स की वास्तविक संख्या के आधार पर, आमतौर पर 2-3 जीबी से बड़ी किसी भी फ़ाइल को मैप करना संभव नहीं होगा मेमोरी एड्रेसिंग इस कार्य के लिए अधिकांश 64 बिट सिस्टम में 48 बिट्स या अधिक उपलब्ध हैं, जिससे आप कम से कम 256 टीबी मैप कर सकते हैं, जिसे मैं लेता हूं, यह पर्याप्त से अधिक है।

+0

मेरे पास एक फ्रीबीएस ओएस है, तो, क्या आपको लगता है कि मैं मेमोरी मैपिंग का उपयोग कर सकता हूं ??? – Invictus

+0

हां। लगभग सभी आधुनिक यूनिक्स 'mmap' फ़ंक्शन के माध्यम से मेमोरी मैपिंग का समर्थन करते हैं। _man_ पृष्ठ उस पर बहुत अधिक जानकारी देता है, जो आपके मामले में [इस तरह] होगा (http://nixdoc.net/man-pages/FreeBSD/mmap.2.html)। आम तौर पर, आवश्यक कदम केवल फ़ाइल डिस्क्रिप्टर खोलने के लिए होते हैं, यदि आवश्यक हो तो इसका आकार पूर्ववत करें (मैन्युअल रूप से या Fallocate या posix_fallocate के माध्यम से) और फिर इसे स्मृति में मैप करें और आप जाने के लिए अच्छे हैं। –

+0

लेकिन, यहां समस्या यह है कि मैं आने वाले डेटा को स्टोर करने के लिए हैश तालिका का उपयोग कर रहा हूं, और, मैं इसे आउटपुट फ़ाइल में लिखना चाहता हूं ... तो, क्या कोई तरीका है ??? – Invictus

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