5

मैं एक प्रोग्राम बना रहा हूं जो दूरस्थ मशीन से संदेश प्राप्त करेगा और संदेशों को डिस्क पर फ़ाइल में लिखने की आवश्यकता है। मुझे जो कठिनाई मिल रही है वह इस तथ्य में निहित है कि इस कार्यक्रम का उद्देश्य पुस्तकालय के प्रदर्शन का परीक्षण करना है जो संदेशों को प्राप्त करता है और इसलिए, मुझे यह सुनिश्चित करना होगा कि डिस्क पर संदेश लिखना पुस्तकालय के प्रदर्शन को प्रभावित न करे । लाइब्रेरी संदेश को कॉलबैक फ़ंक्शन के माध्यम से प्रोग्राम में भेजती है। एक और कठिनाई यह है कि समाधान मंच को स्वतंत्र होना चाहिए।प्लेटफॉर्म स्वतंत्र एसिंक्रोनस फ़ाइल को फ़ाइल को कैसे कार्यान्वित करें?

मेरे पास कौन से विकल्प हैं?

मैं के बारे में सोचा है:

  • boost:asio का उपयोग कर फाइल करने के लिए लिखने के लिए, लेकिन यह (this दस्तावेज़ देखें) लगता है कि फाइल करने के लिए अतुल्यकालिक लिखने इस लायब्रेरी के लिए Windows विशिष्ट भाग में है - तो यह नहीं हो सकता उपयोग किया गया।
  • संदेश कतार बनाने के लिए boost::interprocess का उपयोग करके this documentation इंगित करता है कि संदेश 3 भेजे जा सकते हैं, और संदेश के कतार पूर्ण होने पर सभी विधियों को ब्लॉक (निहित या नहीं) को अवरुद्ध करने की आवश्यकता होगी, जिसे मैं नहीं कर सकता जोखिम।
  • कॉलबैक फ़ंक्शन से डेक को धक्का देने के लिए std::deque<MESSAGES> बनाना, और फ़ाइल (अलग थ्रेड पर) लिखते समय संदेशों को पॉप आउट करें, लेकिन एसटीएल कंटेनर not guaranteed to be thread-safe हैं। मैं धक्का दे रहा था, और डेक कर रहा था, डेक लेकिन हम लगातार संदेशों के बीच 47 माइक्रोसॉन्ड के बारे में बात कर रहे हैं, इसलिए मैं ताले से पूरी तरह से बचना चाहता हूं।

क्या किसी के पास संभावित समाधानों पर कोई और विचार है?

+0

47micros किस संदेश के बीच? क्या यह रिमोट मशीन कैडेंस है? –

उत्तर

2

एसटीएल कंटेनर थ्रेड-सुरक्षित नहीं हो सकते हैं, लेकिन मैंने कभी ऐसा नहीं मारा है जिसे अलग-अलग धागे पर अलग-अलग समय में उपयोग नहीं किया जा सकता है। स्वामित्व को दूसरे धागे में पास करना सुरक्षित लगता है।

मैं एक दो बार निम्नलिखित का इस्तेमाल किया है, तो मैं यह काम करता है पता है:

  • एक std :: वेक्टर के लिए सूचक बनाएँ।
  • वेक्टर पॉइंटर की सुरक्षा के लिए एक म्यूटेक्स लॉक बनाएं।
  • std :: वेक्टर बनाने के लिए नया [] का उपयोग करें और फिर इसके लिए एक बड़ा आकार आरक्षित करें।

रिसीवर धागा में:

  • म्युटेक्स जब भी कतार में एक आइटम जोड़ने लॉक करें। यह एक छोटा ताला होना चाहिए।
  • कतार आइटम जोड़ें।
  • लॉक जारी करें।
  • यदि आपको लगता है कि यह एक शर्त चर संकेत करता है। मैं कभी-कभी नहीं करता: यह डिजाइन पर निर्भर करता है। यदि मात्रा बहुत अधिक है और प्राप्त पक्ष में कोई रोक नहीं है तो बस स्थिति और मतदान को छोड़ दें।

    • जाओ काम के लिए देखो मतदान या एक शर्त चर पर इंतजार द्वारा ऐसा करने के लिए:
    • लॉक कतार म्युटेक्स
    उपभोक्ता धागा (डिस्क लेखक) पर

  • कतार की लंबाई को देखो।
  • यदि कतार में कोई काम है तो उपभोक्ता थ्रेड में एक चर के लिए पॉइंटर असाइन करें।
  • नया कतार वेक्टर बनाने के लिए नया [] और आरक्षित() का उपयोग करें और इसे कतार सूचक को असाइन करें।
  • म्यूटेक्स अनलॉक करें।
  • डिस्क पर जाएं और अपनी आइटम डिस्क पर लिखें।
  • [] उपयोग किए गए कतार वेक्टर को हटाएं।

अब, आपकी समस्या के आधार पर आप को अवरोधित करने के लिए एक तरीका की आवश्यकता हो सकती है। उदाहरण के लिए मेरे कार्यक्रमों में से एक में यदि कतार की लंबाई कभी भी 100,000 वस्तुओं को हिट करती है, तो उत्पादन धागा सिर्फ 1 सेकंड नींद लेता है और बहुत शिकायत करता है। यह उन चीजों में से एक है जो नहीं होना चाहिए, फिर भी करता है, इसलिए आपको इसे विचार करना चाहिए। किसी भी सीमा के बिना यह मशीन पर सभी मेमोरी का उपयोग करेगा और फिर अपवाद के साथ दुर्घटनाग्रस्त हो जाएगा, ओओएम द्वारा मारा जाएगा या बस एक स्वैप तूफान में रुकावट आ जाएगा।

+0

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

+0

एक और नोट: इस डिजाइन ने लिनक्स पर मेरे लिए वास्तव में अच्छा काम किया है, जहां म्यूटेक्स फ़्यूटेक्स का उपयोग करते हैं, जिनमें कोई विवाद नहीं होने पर बहुत कम लागत होती है। और यह क्रिटिकलसेक्शन का उपयोग कर बीएसडी या विंडोज पर बुरा नहीं है। लेकिन चूंकि आप बहुत मल्टीप्लेटफार्म बनना चाहते हैं क्योंकि नेस्टेड कंटेनर लॉकिंग वास्तव में सबसे अच्छा हो सकता है। –

2

बूस्ट :: थ्रेड प्लेटफॉर्म स्वतंत्र है, इसलिए आप ब्लॉकिंग लिखने के लिए एक थ्रेड बनाने में सक्षम होना चाहिए।

std::deque<std::deque<MESSAGES> > 

तो केवल शीर्ष स्तर Deque जब ताला: कंटेनर हर बार संदेश मुख्य थ्रेड में रखा जाता है लॉक करने के लिए आप इस तरह के रूप में नेस्टेड कंटेनर, बनाने के द्वारा डबल बफरिंग तकनीक पर एक संशोधन का उपयोग कर सकते की जरूरत से बचने के लिए संदेशों से भरा एक डेक जोड़ा जाने के लिए तैयार है। लिखित धागे बदले में लिखे जाने वाले संदेशों से भरे डेक को पॉप करने के लिए केवल शीर्ष स्तर के डेक को लॉक कर देगा।

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