osx - Is fprintf thread safe on OS X? -
क्या ओएस एक्स पर fprintf धागा सुरक्षित है? यदि हां, तो यह दस्तावेज कहाँ है?
यह एक अच्छा सवाल था, हालांकि समान प्रश्न यहां पूछे गए हैं कई बार। मुझे OSX पहलू में दिलचस्पी थी क्योंकि मैं उस सिस्टम पर गति बढ़ाने के लिए खुद को उठाने की कोशिश कर रहा था (शायद आपको OSX टैग जोड़ना चाहिए)
मैं THINK fprintf () ओएसएक्स पर धागा सुरक्षित है। इसके लिए मेरा पहला कारण यह है कि डार्विन लोगों ने उस दिशा में जा रहे थे, जैसा कि पुरानी-विद्यालय वैश्विक 'गलत' को छोड़ने के लिए अपनी पसंद के आधार के रूप में कार्य गलत () के पक्ष में। प्रलेखन के लिए, बस '/usr/include/errno.h' का पालन करें इसके बिना, कोई भी लाइब्रेरी सामान थ्रेड सुरक्षित नहीं होगा। फिर भी, errno () फ़ंक्शन का उपयोग fprintf () के बारे में कुछ भी नहीं सिद्ध करता है यह सिर्फ एक शुरुआत है मुझे यकीन है कि कम से कम एक ऐसी परिस्थिति के बारे में हर कोई जानता है जहां ऐप्पल ने एक अच्छा विचार के साथ नहीं किया था।
एक और कारण जो मुझे 'फ्रेड-सुरक्षा' में विश्वास करता है fprintf (), जो है को 'असली चीज़' माना जाना चाहिए, कम से कम 10.6 तक जब एप्पल ने (OSX) का भाग (सभी / सभी) बंद कर दिया। "MT-Safe" के लिए उस कोड को स्कैन करें और आप एक दावे देखेंगे कि 'vfprintf ()' का गैर-लोकेल संस्करण सुरक्षित है फिर, वह कुछ भी साबित नहीं करता। फिर भी यह दस्तावेज़ीकरण का एक रूप है, जिसे आप चाहते थे।
मेरा अंतिम विश्वास है fprintf () धागा-सुरक्षित एक परीक्षण का मामला था। यह कुछ भी बहुत कुछ साबित नहीं करता है शायद यह साबित करता है कि बफर स्थान धागा सुरक्षित है I ठीक है, मस्ती के लिए एक छोटा सा प्रोग्राम लिखने का यह एक बहाना था। असल में, मैंने इसे नहीं लिखा था मुझे एक कंकाल ऑनलाइन मिला, और इसे संशोधित किया। "FLUSH_BUFFER" परिभाषा आपको अधिक स्पष्ट रूप से देखने की अनुमति देता है कि क्या हो रहा है। यदि उस मैक्रो को परिभाषित नहीं किया गया है, तो आपको 'सॉर्ट-ऑफ' बफर टेस्ट मिलता है (कुछ पंक्ति-टर्मिनेटर के बिना एक ही टेक्स्ट) मैं थ्रेड्स का और अधिक अर्थपूर्ण टकराव की व्यवस्था करने का कोई तरीका नहीं समझ सका।
मुझे लगता है कि आप कई फाइलों को लिख सकते हैं एक फाइल में लिखना शायद एक बेहतर परीक्षण है। संलग्न प्रोग्राम एक निश्चित परीक्षा नहीं है। यद्यपि इसे बढ़ाया जा सकता है, मुझे यकीन नहीं है कि किसी भी कार्यक्रम वास्तव में निश्चित हो सकता है। नीचे की रेखा: शायद आपको अपने कॉल को फ्रिंन्टफ़ () के लिए म्यूट करना चाहिए।
// fprintf () के धागा सुरक्षा के लिए कृत्रिम परीक्षण // परिभाषित करें FLUSH_BUFFER क्या हो रहा है की एक अच्छी तस्वीर प्राप्त करने के लिए, संयुक्त राष्ट्र बफ़र परीक्षण के लिए एडीएफ / 'बहुत प्रिंट' (फ्लुस एचबीयूएफएफईआर) आउटपुट एक मोनो-स्पेस फॉन्ट पर निर्भर करता है // कमांड लाइन पर एक लेखनयोग्य फाइल नाम उस फ़ाइल को आउटपुट भेज देगा // # शामिल करें & lt; pthread.h & gt; # शामिल करें & lt; stdio.h & gt; # शामिल करें & lt; stdlib.h & gt; # शामिल करें & lt; unistd.h & gt; #define FLUSH_BUFFER #define NTHREAD 5 # परिभाषित इटेरेशन 3 कॉन्स्ट चार्ल्स डॉट्स [] = "... ... ... ... ...। फ़ाइल * आउटफ़ाइल; शून्य * प्रिंटहेलो (शून्य * थ्रेडिड) {लंबे समय तक; Tid = (लंबे) धागा; के लिए (इंट आई = 1; आई & lt; = आईटीएआरटीएस; आई ++) {लंबी देरी = (एनथ्रैड-टीआईडी) * 100000 + (आईटीईआरएएस-आई + 1) * 10000; #ifdef FLUSH_BUFFER fprintf (आउटफाइल, "% * sStart thread% d पुनरावर्तन% d \ n", (टीआईडी + 1) * 4, "", टीआईडी, आई); usleep (देरी); Fprintf (outFile, "% * sFinish thread% d पुनरावर्तन% d% *। * Sw / delay% d \ n", (tid + 1) * 4, "", tid, i, (NTHREAD-tid + 1) * 4, (NTHREAD-tid + 1) * 4, डॉट्स, देरी); # एल्स fprintf (आउटफाइल, "धागा% d चलना% d" प्रारंभ करें, tid, i); usleep (देरी); Fprintf (आउटफ़ाइल, "समाप्त थ्रेड% d पुनरावर्तन% d w / देरी% d \ n", tid, i, देरी); #endif} pthread_exit (NULL); } Int main (int argc, char * argv []) {pthread_t थ्रेड्स [NTHREAD]; Char errStr [100]; Int rc; लम्बा टी; If (argc & gt; 1) {if (! (OutFile = fopen (argv [1], "w"))) {दर्पण (argv [1]); बाहर निकलने के (1); }} और बाहरफ़ाइल = stdout; के लिए (टी = 0; टी & lt; NTHREAD; t ++) {fprintf (आउटफाइल, "मुख्य में: धागा% ld बनाने के लिए \ n", t); यदि (आर.सी. = थ्रेड [टी], नल, प्रिंटहोल्लो, (शून्य *) टी)) {sprintf (errStr, "ERROR; pthread_create ()% d", आरसी वापस); perror (errStr); बाहर निकलने के (2); }} Pthread_exit (NULL); }
Comments
Post a Comment