2010-05-28 13 views
15

में मैं यदि संभव हो तो एक फाइल करने के लिए, मेरे सी ++ परियोजना में अतुल्यकालिक और धागे की सुरक्षित प्रवेश करने के लिए एक रास्ता तलाश कर रहा हूँ। मैं वर्तमान में कार्य के लिए cerr और clog का उपयोग कर रहा हूं, लेकिन चूंकि वे सिंक्रोनस हैं, इसलिए निष्पादन हर बार कुछ लॉग होने पर रोक देता है। यह अपेक्षाकृत ग्राफिक्स-भारी ऐप है, इसलिए इस तरह की चीज काफी परेशान है।अतुल्यकालिक धागा सुरक्षित लॉगिंग सी ++

नई लकड़हारा अतुल्यकालिक आई/ओ का उपयोग करना चाहिए इन रुक जाता है से छुटकारा पाने के। थ्रेड-सुरक्षा भी वांछनीय होगी क्योंकि मैं जल्द ही कुछ बुनियादी मल्टीथ्रेडिंग जोड़ना चाहता हूं।

मैं एक एक फ़ाइल-प्रति-धागा दृष्टिकोण माना जाता है, लेकिन वह यह लॉग प्रबंध एक बुरा सपना हो जाएगा की तरह लग रहा था। कोई सुझाव?

उत्तर

4

यह बहुत संभव और व्यावहारिक है। मुझे कैसे पता चलेगा? मैंने बिल्कुल लिखा कि मेरे आखिरी काम पर। दुर्भाग्य से (हमारे लिए), अब वे कोड के मालिक हैं। :-) अफसोस की बात है, वे इसका भी उपयोग नहीं करते हैं।

मैं निकट भविष्य में एक खुला स्रोत संस्करण लिखने पर करना चाहते हैं। इस बीच, मैं आपको कुछ संकेत दे सकता हूं।

  1. आई/ओ मैनिपुलेटर्स वास्तव में केवल कार्य नाम हैं। आप उन्हें अपनी लॉगिंग कक्षा के लिए कार्यान्वित कर सकते हैं ताकि आपका लॉगर cout/cin संगत हो।
  2. आपके मैनिपुलेटर फ़ंक्शन ऑपरेशंस को टोकननाइज़ कर सकते हैं और उन्हें कतार में स्टोर कर सकते हैं।
  3. उस कतार पर एक थ्रेड को अवरुद्ध किया जा सकता है जिससे लॉग के भाग आने के लिए इंतजार कर रहे हैं। यह तब स्ट्रिंग ऑपरेशंस को संसाधित करता है और वास्तविक लॉग उत्पन्न करता है।

यह आंतरिक रूप से थ्रेड संगत है क्योंकि आप कतार का उपयोग कर रहे हैं। हालांकि, आप अभी भी कतार में लिखने के आसपास कुछ म्यूटेक्स जैसी सुरक्षा रखना चाहते हैं ताकि एक दिया गया लॉग < < "सामान" < < "अधिक सामान"; प्रकार ऑपरेशन लाइन परमाणु बनी हुई है।

मज़े करो!

+0

एक म्युटेक्स नहीं मतलब होता है कि अगर एक धागा पहले से ही लिखने की कोशिश कर रहा है, यह स्पिन जब तक उसे अनलॉक किया गया था होगा? यह कैसे मदद करता है? – Electro

+0

मैं निश्चित रूप से धारा में ऑब्जेक्ट के रूपांतरण में देरी नहीं करूँगा। इसे किसी अन्य धागे में रखना मतलब है कि इसे सिंक्रनाइज़ करना ... और यह नरक के रूप में चोट पहुंचाने की संभावना है। –

+0

@ इलेक्ट्रो - स्पिन नहीं, लेकिन ब्लॉक। लेकिन यदि आप स्ट्रिंग प्रोसेसिंग नहीं कर रहे हैं तो यह कतार लोड करने के लिए बहुत छोटा अंतराल है। स्ट्रिंग प्रसंस्करण लॉगिंग थ्रेड द्वारा किया जाता है। @Matthieu, वास्तविक समय में स्ट्रिंग प्रसंस्करण करने से कतार लोड करते समय किसी भी म्यूटेक्स अवरोधन से बहुत अधिक दर्द होता है। –

0

मुझे लगता है कि उचित दृष्टिकोण एक फ़ाइल-प्रति-धागा, लेकिन एक धागा-प्रति-फ़ाइल नहीं है। यदि आपके सिस्टम में किसी एक फ़ाइल (या सामान्य रूप से संसाधन) को केवल एक थ्रेड द्वारा एक्सेस किया जाता है, तो थ्रेड-सुरक्षित प्रोग्रामिंग इतना आसान हो जाता है।

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

+0

आप लॉक-फ्री कतार के साथ एक म्यूटेक्स का उपयोग किये बिना दूर हो सकते हैं। हालांकि सशर्त चर बहुत अलग है। चार्ज के आधार पर, आप सोने के बजाय कताई पसंद कर सकते हैं और बाद में जागृत हो सकते हैं। यह इस बात पर भी निर्भर करता है कि आपके पास निष्क्रिय कोर हैं या नहीं :) –

+0

यदि कुछ हमारे सिस्टम में व्यस्त रहता है, तो वॉचडॉग पूरे एप्लिकेशन को मार देगा :) – Cubbi

1

क्या आपने लॉग लाइब्रेरी का उपयोग करने पर विचार किया है।

कई उपलब्ध हैं, मैंने हाल ही में Pantheios खोजा और यह वास्तव में काफी अविश्वसनीय प्रतीत होता है।

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

तुम सिर्फ एक barebone प्रवेश पुस्तकालय चाहते हैं:

  • ऐस
  • log4c *
  • Boost.Log

उठाओ किसी भी :)

मैं नोट करना चाहिए कि यह सी ++ में लॉक-फ्री कतारों को लागू करना संभव है और वे लॉगिंग के लिए बहुत अच्छे हैं।

+0

एचएम, मुझे नहीं लगता कि मैं इनमें से किसी को भी लाना चाहता हूं।पूर्व दो ओवरकिल की तरह लगते हैं, और बाद में इसकी समीक्षा में बहुत सारे प्रदर्शन मुद्दे थे, जो कारणों में से एक था जिसे उन्होंने बूस्ट संग्रह में उचित रूप से नहीं जोड़ा था। – Electro

17

मैं इस 1 वर्ष + पुराने धागा देखा। शायद मैंने लिखा एसिंक्रोनस लॉगर ब्याज का हो सकता है।

http://www.codeproject.com/KB/library/g2log.aspx

G2log एक पृष्ठभूमि कार्यकर्ता कि धीमी गति से डिस्क तक पहुँचता करने के लिए लॉग प्रविष्टियों को अग्रेषित करने के एक संरक्षित संदेश कतार का उपयोग करता है।

मैंने इसे लॉक-फ्री कतार के साथ करने की कोशिश की है जो LOG कॉल के औसत समय में वृद्धि हुई है, लेकिन सबसे बुरी स्थिति का समय कम हो गया है, हालांकि मैं अब संरक्षित कतार का उपयोग कर रहा हूं क्योंकि यह क्रॉस-प्लेटफार्म है। यह विंडोज/विजुअल स्टूडियो 2010 और उबंटू 11.10/जीसीसी 4.6 पर परीक्षण किया गया है।

यह सार्वजनिक डोमेन के रूप में क्या आप कोई संलग्न तार के साथ चाहते हैं तो आप इसके साथ क्या कर सकते हैं जारी है।

+0

लॉगिंग करने पर सामान्य बात यह है कि किसी भी अवरोध (उदाहरण के लिए प्रिंट के साथ डीबगिंग दौड़ की स्थिति ..) यह काम करता है और सरल है!) एक थ्रेड स्थानीय संदेश कतार का उपयोग करना है जो टाइमस्टैम्प के साथ टोकन स्टोर करता है (इस मामले में अच्छी तरह से शायद इसे सीधे async IO के साथ बेहतर आउटपुट)। यदि आपको डेटा की आवश्यकता है, तो आपको बाद में आउटपुट को सॉर्ट करना होगा और सामान्य लॉगिंग के लिए यह बोझिल है, लेकिन इसमें सबसे कम संभव सिंक्रनाइज़ेशन राशि है: शून्य। – Voo

+0

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

+0

@ KjellHedström - इस लिंक में दिए गए चरणों का पालन करें http: // stackoverflow। अपने खातों को विलय करने के लिए कॉम/सहायता/उपयोगकर्ता-विलय करें। – ChrisF

0

मैं एक ही मुद्दा था और मेरा मानना ​​है कि मैं सही समाधान मिल गया है। https://github.com/emilk/loguru

यह और डिफ़ॉल्ट नहीं #include कुछ भी (कि मिठाई, मिठाई संकलन समय के लिए) करता है के द्वारा उपयोग करने के लिए सरल, पोर्टेबल, विन्यास, मैक्रो आधारित है: मैं आप के लिए प्रस्तुत करते हैं, एक एकल हैडर पुस्तकालय loguru कहा जाता है।

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