2011-10-21 18 views
11

के लिए थ्रेड स्थानीय संग्रहण मेरे पास एक बहुत पुरानी लेकिन बहुत बड़ी लाइब्रेरी है जिसे मैं सी # कक्षा पुस्तकालय में परिवर्तित करने पर विचार कर रहा हूं। मौजूदा पुस्तकालय टीएलएस में संग्रहीत कई वैश्विक चर का उपयोग करता है। सी # में ग्लोबल वेरिएबल्स की कोई वास्तविक अवधारणा नहीं है, लेकिन एक वर्कअराउंड ग्लोबलवार जैसे कुछ स्टैटिक क्लास का उपयोग करना है और उन्हें सभी को इस वर्ग में डाल देना है ताकि उन्हें ग्लोबलवार.xxxxxxसी # कक्षा पुस्तकालय

के माध्यम से एक्सेस किया जा सके, हालांकि, मेरी सोच यह है कि यह टूट जाएगा ग्लोबलवायर क्लास के रूप में परिवर्तित होने वाले सभी मौजूदा कोड सामान्य वैश्विक वर्ग होंगे और प्रति थ्रेड स्टोरेज नहीं होंगे। क्या इन ग्लोबल्स को प्रति थ्रेड होने का कोई तरीका है? यानी सी # में __declspec (थ्रेड) स्थिर के बराबर क्या है?

मुझे इस बिंदु पर जोड़ना चाहिए कि मुझे वैश्विक चर से नफरत है। मुझे लगता है कि वे अक्सर खराब डिजाइन का परिणाम होते हैं। हालांकि, कड़े समय प्रतिबंधों के कारण, चरण एक पुस्तकालय को न्यूनतम झगड़े के साथ सी # में परिवर्तित करना है और फिर चरण 2 उन्हें ठीक से फिर से डिजाइन करना होगा।

उत्तर

14

ThreadLocal कक्षा (4.0 में पेश की गई) और ThreadStaticAttribute हैं।

ThreadStaticAttribute केवल static फ़ील्ड पर उपयोग किया जा सकता है। ThreadLocal वर्ग "सामान्य" फ़ील्ड पर उपयोग किया जा सकता है लेकिन यह धीमा है।

ध्यान रखें कि यदि आप उस धागे को नियंत्रित नहीं करते हैं जिस पर आप हैं (उदाहरण के लिए आप एएसपी.नेट का एक पृष्ठ हैं और आप "यादृच्छिक" प्री-प्रयुक्त थ्रेड पर प्रारंभ करते हैं, या आप थ्रेडपूल का धागा हैं), फिर आपके "थ्रेड-स्टेटिक" (सामान्य रूप से, विशेषता नहीं) चर पिछले धागे के पुराने मानों के साथ पूर्व-प्रारंभ किए जाएंगे। (उदाहरण के लिए देखें A tale of two techniques: The [ThreadStatic] Attribute and System.Web.HttpContext.Current.Items)

मैं भूल रहा था, Thread.AllocateDataSlot है जो दूसरों की तुलना में समान "उद्देश्यों" है।

+0

हेहे, आप हमें इतालवी भाषा सिखाने पर जोर देते हैं :-) –

+0

@xanatos 'थ्रेडस्टैटिक एट्रिब्यूट केवल स्थिर फ़ील्ड पर उपयोग किया जा सकता है 'हमेशा सत्य नहीं होता है। लोग प्रति-थ्रेड-प्रति-आवृत्ति चर घोषित करना चाहते हैं –

+0

मेरा इतालवी इतना अच्छा नहीं है लेकिन मजाक कर रहा है, मदद के लिए बहुत धन्यवाद। हालांकि मैं थ्रेडपूल का उपयोग करने के लिए अंतिम पैराग्राफ के बारे में चिंतित हूं। मुझे नहीं लगता कि यह पहले एक मुद्दा होगा लेकिन यह ऐसा कुछ है जिसे भविष्य में विचार करने की आवश्यकता हो सकती है। – Jonnster

3

आप [ThreadStatic] विशेषता का उपयोग करके या ThreadLocal कक्षा का उपयोग करके .NET 4 में एक ही थ्रेड स्थानीय संग्रहण प्राप्त कर सकते हैं।

[ThreadStatic]  
private static string MyThreadGlobal; 

private ThreadLocal<string> MyThreadGlobal = new ThreadLocal<string>(); 

वहाँ भी CallContext वर्ग है, लेकिन अन्य तरीकों शायद पसंद किया जाता है।

3

यह मानकर आप .NET 4.0 उपयोग करने के लिए, आप हो सकता है जा रहे हैं एक static ThreadLocal<ThreadLocalData> जहाँ आपके ThreadLocalData वर्ग गुण के रूप में अपने सभी चर है:

class ThreadLocalData 
{ 
    public int GlobalInt { get; set; } 
    public string GlobalString { get; set; } 
} 

class Global 
{ 
    static ThreadLocal<ThreadLocalData> _ThreadLocal = 
     new ThreadLocal<ThreadLocalData>(() => new ThreadLocalData()); 

    public static ThreadLocalData ThreadLocal 
    { 
     get { return _ThreadLocal.Value; } 
    } 
} 

फिर आप इस तरह के गुण का उपयोग होगा:

int i = Global.ThreadLocal.GlobalInt; 

आप किसी भी वैश्विक चर को जोड़ सकते हैं जो Global कक्षा के सामान्य गुणों के रूप में थ्रेड-लोकल नहीं हैं।

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