2010-01-15 9 views
20

मैं जानना चाहता हूं कि सी # स्वचालित रूप से लागू गुणों जैसे public static T Prop { get; set; }, थ्रेड-सुरक्षित हैं या नहीं। धन्यवाद!सी # ऑटो-कार्यान्वित स्थैतिक गुण थ्रेड-सुरक्षित हैं?

+0

आपको यह परिभाषित करना होगा कि आप इस विशेष उदाहरण में पहले "थ्रेड सुरक्षित" से क्या मतलब रखते हैं। –

+0

थ्रेड-सुरक्षित द्वारा मेरा मतलब है, अगर मैं एक धागे में मान लिखता हूं, और दूसरा धागा इसे पढ़ने की कोशिश करता है, तो दूसरा थ्रेड गलत मान प्राप्त कर सकता है। –

उत्तर

15

ऐसा प्रतीत नहीं होता है। यह परावर्तक के साथ विघटन है:

private static string Test 
{ 
    [CompilerGenerated] 
    get 
    { 
     return <Test>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     <Test>k__BackingField = value; 
    } 
} 
+0

यह गलत है। .NET का मेमोरी मॉडल गारंटी देता है कि उन्हें लिखना परमाणु होगा और कम से कम नियमित .NET फ्रेमवर्क के लिए सभी धागे द्वारा देखा जाएगा, और यदि वे आभासी नहीं हैं तो वे हमेशा रेखांकित होंगे।दोनों .NET डेस्कटॉप ढांचे के कार्यान्वयन विवरण हैं और हालांकि, spec द्वारा गारंटी नहीं है। –

+0

er मेरा मतलब है कि विघटन सही है, लेकिन जिस तरह से वे कार्यान्वित किए जाते हैं, कम से कम पूर्णांक और संदर्भ प्रकारों के लिए परमाणुता की गारंटी देता है (स्पष्ट चेतावनी के साथ कि परमाणुता! = थ्रेड सुरक्षा)। लंबे समय तक/युगल/structs/आदि के लिए, आप अपने आप पर हैं, यद्यपि। –

+3

spec गारंटी देता है कि 'Int32',' float' और संदर्भ जैसी चीजें ** परमाणु ** हैं। यह थ्रेड दृश्यता/रजिस्टर कैशिंग इत्यादि के बारे में कई गारंटी नहीं देता है –

2

नहीं, वे थ्रेडसेफ नहीं हैं। स्थैतिक गुण स्थिर क्षेत्रों के रूप में कमजोर के रूप में समेकित मुद्दों के लिए हैं।

4

मुझे विश्वास नहीं है। मेरा मानना ​​है कि वे सिर्फ सिंथेटिक चीनी हैं:

private static T _prop; 
public static T Prop 
{ 
    get { return _prop; } 
    set { _prop = value; } 
} 
5

नहीं। आपको उन्हें थ्रेड-लॉकिंग तंत्र में लपेटना होगा।

object _lock = new object(); 
public static Main(string[] args) 
{ 
    lock(_lock) 
    { 
     Prop = new T(); 
    } 


    T val = null; 
    lock(_lock) 
    { 
     val = Prop; 
    } 
} 
+1

प्रोप क्या है? टी क्या है? –

+4

प्रोप और टी सवाल से हैं। – Amy

4

स्थैतिक गुणों सहित स्वत: गुणों के साथ प्रदान किए गए कोई सिंक्रनाइज़ेशन नहीं है।

यदि आपको पूर्ण थ्रेड सुरक्षा की आवश्यकता है, तो आप बैकिंग फ़ील्ड के साथ अपनी खुद की संपत्तियों का उपयोग करना चाहेंगे, और सिंक्रनाइज़ेशन को स्वयं संभाल लेंगे।

4

पूर्णता के लिए, फ़ील्ड जैसी घटनाएं में थ्रेड-सुरक्षा निर्मित है, लेकिन वे इसमें अकेले हैं। स्वचालित रूप से कार्यान्वित गुण ऐसी कोई विशेषताएं नहीं हैं।

public static double SomeProp 
{ // ### NOT RECOMMENDED ### 
    [MethodImpl(MethodImplOptions.Synchronized)] get; 
    [MethodImpl(MethodImplOptions.Synchronized)] set; 
} 

इस के साथ समस्या यह है कि यह Type है, जो एक बुरी बात है लॉक हो जाएगा है: हालांकि, आप की तरह कुछ कर सकते हैं। मैं व्यक्तिगत रूप से इसके लिए अपने स्वयं के सिंक्रनाइज़ेशन को लागू करूंगा।

+1

"मार्शल-बाय-ब्लीड" के कारणों के लिए "खराब" जहां टाइप लॉक एक ही प्रक्रिया में अन्य पृथक एपडोमेन में खून बह रहा है ... – x0n

+1

यह एक ऐप-डोमेन सत्य के साथ बस इतना खराब है। –

47

सी # विनिर्देश राज्यों की धारा 10.7.4:

एक संपत्ति एक स्वचालित रूप से लागू किया संपत्ति के रूप में निर्दिष्ट किया जाता है, एक छिपा समर्थन क्षेत्र स्वचालित रूप से संपत्ति के लिए उपलब्ध है, और accessors हैं से पढ़ने के लिए लागू किया गया है और उस बैकिंग फ़ील्ड को लिखें। निम्न उदाहरण:

public class Point { 
    public int X { get; set; } // automatically implemented 
    public int Y { get; set; } // automatically implemented 
} 

निम्नलिखित घोषणा के बराबर है:

public class Point { 
    private int x; 
    private int y; 
    public int X { get { return x; } set { x = value; } } 
    public int Y { get { return y; } set { y = value; } } 
} 

है यही कारण है कि हम क्या वादा, और कहा कि तुम क्या मिलता है। ऑटो गुणों का बिंदु सबसे बुनियादी, सरल, सस्ती चीज करना है; अगर आप कुछ फैनसीयर करना चाहते हैं तो आपको एक "वास्तविक" संपत्ति लिखनी चाहिए।

+7

आपको वास्तविक सी # विनिर्देश के संदर्भ के लिए उपरोक्त किया गया। –