2012-11-25 13 views
29

मुझे पता है कि अगर मेरे पास putStrLn पर किसी भी तरह के समेकन नियंत्रण के बिना कई धागे हैं जो धागे के आउटपुट को अंतःस्थापित किया जा सकता है।putStrLn धागा-सुरक्षित है?

मेरा सवाल यह है कि putStrLn इस इंटरलीव्ड आउटपुट थ्रेड-सुरक्षित मॉड्यूलो है?

मुझे लगता है कि putStrLn एक बफर किए गए लेखन ऑपरेशन है, इसलिए मैं वास्तव में पूछ रहा हूं कि आउटपुट बफर का कोई भ्रष्टाचार दो थ्रेड होने पर putStrLn पर कॉल कर सकता है।

और सामान्य रूप से, हास्केल (वास्तव में जीएचसी) के अन्य "मानक I/O" कार्यों की थ्रेड सुरक्षा के बारे में क्या कहा जा सकता है? विशेष रूप से, किसी भी बफर किए गए पढ़ने के संचालन के लिए क्या एक ही चरित्र के लिए एक ही समय में एक ही पठन कॉल करने के लिए दो अलग-अलग धागे पर वापस जाना संभव है?

+0

मुझे नहीं लगता कि मैंने कभी ऐसी लाइब्रेरी के बारे में सुना है जिसका स्टडआउट आउटपुट थ्रेड-सुरक्षित नहीं है (मैं सामान्य सी/सी ++ रनटाइम, सी #, जावा इत्यादि के बारे में सोच रहा हूं) तो अगर मुझे करना पड़ा एक अनुमान लगाओ मैं कहूंगा कि यह भी ठीक है। हालांकि अच्छा सवाल +1। – Mehrdad

+0

लिनक्स 'putStrLn' पर और दोस्तों ['write'] (http://linux.die.net/man/2/write) के माध्यम से लागू किए गए और [' select'] (http://linux.die.net/man/2/चयन करें) एक निश्चित लंबाई के ब्लॉक के लिए जोड़े (जब लाइन- या ब्लॉक-बफरिंग के साथ), तो सवाल यह है कि 'लिखना' थ्रेड-सुरक्षित है या नहीं। POSIX को 'लिखने' (1003.1-2001: 2.9.1 और 2.9.7) के लिए थ्रेड-सुरक्षा की आवश्यकता होती है, और आमतौर पर यह होती है। – JJJ

+0

और 'MVar' ताले ['futex'] (http://linux.die.net/man/4/futex) के साथ कार्यान्वित किए गए (जब' थ्रेडेड 'रनटाइम के साथ)। तो @ शचाफ जवाब सही है। – JJJ

उत्तर

28

हां, यह उस अर्थ में थ्रेड-सुरक्षित है जिसे आप पूछ रहे हैं। Handle को MVar द्वारा संरक्षित किया गया है जो बफर को दूषित होने की अनुमति नहीं देगा। जैसा कि आपने बताया, हालांकि, इंटरलिविंग एक अलग मामला है।