2009-09-27 8 views
10

मैं जानता हूँ कि वर्तमान C++ में धागे की धारणा नहीं है कि वहाँ है, लेकिन this article is saying:सी ++ थ्रेड-सुरक्षित (cout, cerr, clog) में मानक आउटपुट स्ट्रीम हैं?

एक typesafe, threadsafe, पोर्टेबल प्रवेश तंत्र

.....

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

क्या cout, cerr और clog के बारे में?

मुझे लगता है कि यह प्रश्न C++ में सभी प्रकार के स्ट्रीम प्रकारों पर लागू होता है, जैसे fstream और stringstream

+2

[नोट: उत्तर अब "हाँ" है, सी ++ 11 में) (http://stackoverflow.com/a/6374525/87234)। – GManNickG

+0

@GManNickG: मैं विजुअल स्टूडियो 2013 सी ++ का उपयोग करता हूं और अभी भी थ्रेड सुरक्षित नहीं है। स्क्रीन पर आउटपुट ज्यादातर दूषित/intermixed हैं। –

+0

@MehmetFide: थ्रेड-सुरक्षा सिंक्रनाइज़ेशन (मिश्रित/interleaved तार) से अलग है; सी ++ 11 मानक गारेंटेस कि कार्यान्वयन विभिन्न वस्तुओं से इन वस्तुओं का उपयोग करने पर डेटा दौड़ का कारण नहीं बनता है, जबकि यह सुनिश्चित करने के लिए कि एकाधिक 'ऑपरेटर <<' कॉल सिंक्रनाइज़ हैं। – legends2k

उत्तर

8

आलेख fprintf API के लिए POSIX मानक के बारे में दावा करता है। यह सी ++ धाराओं के बारे में कुछ भी नहीं कहता है। और यह काफी सही है, क्योंकि उन धाराओं पर ऐसी कोई गारंटी नहीं है।

नोट हालांकि उस लेख में प्रवेश वर्ग सी ++ धारा सिंटैक्स का उपयोग करता है, यह एक std::ostringstream उद्देश्य यह है कि बनाया है और हर लॉगिंग घटना के लिए नष्ट हो जाता है, और इसलिए धागे के बीच साझा नहीं है के माध्यम से इस करता है। वास्तव में कंसोल पर सामग्री लिखने के लिए यह fprintf का उपयोग करता है।

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

9

यह कार्यान्वयन-विशिष्ट विवरण होगा। आप पूछ सकते हैं कि रन टाइम लाइब्रेरी वाई के साथ कंपाइलर एक्स में थ्रेड-सुरक्षित मानक धाराएं हैं, लेकिन आप यह नहीं पूछ सकते कि सभी कार्यान्वयन क्या करते हैं, क्योंकि थ्रेड सुरक्षा के संबंध में कार्यान्वयन को अलग करने की अनुमति है। यह इसका अर्थ है कि सी ++ में धागे की कोई अंतर्निहित अवधारणा नहीं है। यह सभी कार्यान्वयन-विशिष्ट है।

+0

जो मैं भी सोचता हूं :) लेकिन लेख का दावा है कि कोड पोर्टेबल भी है! – AraK

+2

मुझे लगता है कि लेख का लेखक बस यह कह रहा है कि यह हर जगह काम करता है जिसने कोशिश की है। उन्होंने शायद यह कोशिश नहीं की है कि, केल सी होमग्राउनआरटीओएस v1.2, या अन्य असामान्य संयोजनों की संख्या के साथ। –

+0

लेख सी ++ धाराओं के बारे में बात नहीं कर रहा है। –

3

चूंकि वर्तमान सी ++ मानक यह भी स्वीकार नहीं करता है कि "धागे" नामक चीजें हैं, यह निश्चित रूप से थ्रेड-सुरक्षा के संबंध में कोई गारंटी नहीं देती है।

यह सभी कार्यान्वयन-परिभाषित है।