2011-03-14 7 views
5

जब एक अपरिवर्तनीय वस्तु को एक थ्रेड में नया किया जाता है, और दूसरे थ्रेड में साझा किया जाता है (साझा ऑब्जेक्ट के क्षेत्र के रूप में कहें), तो दूसरा थ्रेड सिंक्रनाइज़ नहीं होना चाहिए?क्या सी # में स्मृति बाधा में अपरिवर्तनीय वस्तु को एक्सेस करने की आवश्यकता है?

Thread1: 
========= 
x = new SomeObject() 

Thread2 
========= 
if (x != null) 
x.DoSomething() 

क्या x.DoSomething() से पहले स्मृति बाधा होनी चाहिए? क्या यह संभव है कि पहले धागे में एक्स को असाइनमेंट दूसरे थ्रेड पर कभी दिखाई न दे? .NET के लिए सुरक्षित प्रकाशन पैटर्न क्या है?

उत्तर

2

हां, यह संभव है कि थ्रेड 2 आपके द्वारा लिखे गए कोड के साथ x का गैर-शून्य मान कभी नहीं देखेगा (कोड को अनुकूलित करने के तरीके के आधार पर)। आपको एक स्पष्ट स्मृति बाधा की आवश्यकता नहीं है। बस एक्स को अस्थिर घोषित करें।

+0

ठीक है। क्या .NET के लिए कोई सुरक्षित प्रकाशन संबंधित जानकारी/दस्तावेज़ीकरण है? – drr

+1

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

+0

मुझे ऐसा कोई दस्तावेज नहीं है जो ऐसा कहता है, लेकिन सुरक्षित होने के लिए लिखने और पढ़ने पर स्मृति बाड़ की आवश्यकता होगी। जैसा कि आप उल्लेख किए गए कई तरीकों से प्राप्त कर सकते हैं, ताले, अस्थिर, थ्रेड। वोल्टाइल रीड/लिखें, मेमोरीबैरियर को स्पष्ट कॉल। अधिक जानकारी के लिए [सी # में थ्रेडिंग] देखें (http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility) – BrandonAGr

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