2009-02-27 17 views
7

fprintf धागा-सुरक्षित है? The glibc manual ऐसा लगता है कि यह है, लेकिन मेरा एप्लिकेशन, जो fprintf() को एकल कॉल का उपयोग करके फ़ाइल में लिखता है, अलग-अलग प्रक्रियाओं से आंशिक लेखन को जोड़ता है।क्या ग्लिब का fprintf() थ्रेड-सुरक्षित का कार्यान्वयन है?

संपादित करें: स्पष्टीकरण के लिए, प्रश्न में प्रोग्राम lighttpd प्लगइन है, और सर्वर एकाधिक कार्यकर्ता धागे के साथ चल रहा है।

फ़ाइल को देखते हुए, कुछ लिखने में अंतर होता है।

संपादित 2: यह समस्या मैं हो सकता है दिखाई दे रही है अलग प्रक्रियाओं वास्तव में किया जा रहा है lighttpd के "कार्यकर्ता धागे" की वजह से लगता है: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor

समस्याएं

2 या अधिक प्रक्रियाओं चलाकर पर एक ही सॉकेट आपके पास बेहतर समेकन होगा, लेकिन इसमें कुछ दोष होंगे जिन्हें आपको अवगत होना चाहिए :

  • mod_accesslog टूटी हुई एक्सेस लॉग बना सकता है, क्योंकि एक ही फ़ाइल दो बार खोली जाती है और सिंक्रनाइज़ नहीं होती है।
  • mod_status n अलग काउंटर होगा, प्रत्येक प्रक्रिया के लिए एक सेट होगा।
  • mod_rrdtool विफल हो जाएगा क्योंकि यह दो बार समान टाइमस्टैम्प प्राप्त करता है।
  • mod_uploadprogress सही स्थिति नहीं दिखाएगा। एक से अधिक थ्रेड से लेखन और कई प्रक्रियाओं से लिख -
+0

क्या आप इसे एक फ़ाइल में देख रहे हैं जिसे आप 'fprintf' के साथ लिखते हैं, या आप इसे' stdout' और 'stderr' धाराओं में देख रहे हैं? –

उत्तर

14

आप दो अवधारणाओं भ्रमित कर रहे हैं।

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

7

मुझे लगता है जैसे आपको file locking पर पढ़ने की आवश्यकता है। आपके पास समस्या यह है कि कई प्रक्रियाएं (यानी धागे नहीं) एक ही फाइल पर एक साथ लिख रहे हैं और लिखने के लिए कोई भरोसेमंद तरीका परमाणु नहीं होगा। इसके परिणामस्वरूप फाइलें एक दूसरे के लेखन, मिश्रित आउटपुट, और पूरी तरह से गैर-निर्धारक व्यवहार को ओवरराइट कर सकती हैं।

इसका थ्रेड सुरक्षा से कोई लेना-देना नहीं है, क्योंकि यह केवल एकल प्रक्रिया वाले मल्टीथ्रेडिंग कार्यक्रमों में प्रासंगिक है।

2

वर्तमान सी ++ मानक समरूपता के बारे में कुछ भी उपयोगी नहीं कहता है, न ही 1 99 0 सी मानक। (मैंने 1 999 सी मानक नहीं पढ़ा है, इसलिए इस पर टिप्पणी नहीं कर सकते; आगामी सी ++ 0 एक्स मानक चीजें कहता है, लेकिन मुझे बिल्कुल पता नहीं है कि क्या ऑफशैंड है।)

इसका मतलब है कि fprintf () खुद न तो थ्रेड-सुरक्षित और न ही अन्यथा है, और यह कार्यान्वयन पर निर्भर करेगा। मैं ठीक से पढ़ूंगा कि ग्लिबैक दस्तावेज इसके बारे में क्या कहता है, और इसकी तुलना इसकी तुलना में करें कि आप क्या कर रहे हैं।

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