2013-08-20 7 views
61

[ThreadStatic] विशेषता का उपयोग करके परिभाषित किया गया है जबकि ThreadLocal<T> जेनेरिक का उपयोग करता है। विभिन्न डिज़ाइन समाधान क्यों चुने गए थे? इस मामले में जेनेरिक ओवर विशेषताओं का उपयोग करने के फायदे और नुकसान क्या हैं?थ्रेडस्टैटिक बनाम। थ्रेडलोकल <T>: विशेषता से सामान्य सामान्य है?

+4

देखें http://reedcopsey.com/2009/11/12/thread-specific-data-becomes-easier-in-net-4-0-via-threadlocalt/ - मुझे नहीं पता कि यह क्या है प्रतिबिंब के साथ हालांकि ... –

उत्तर

72

टिप्पणियों में नोट किया गया ब्लॉग पोस्ट कुछ स्पष्ट नहीं करता है, लेकिन मुझे बहुत महत्वपूर्ण लगता है, [ThreadStatic] स्वचालित रूप से प्रत्येक थ्रेड के लिए चीजों को प्रारंभ नहीं करता है। उदाहरण के लिए, आप यह कहते हैं:

[ThreadStatic] 
private static int Foo = 42; 

पहले धागा का उपयोग करता है इस Foo42 के लिए शुरू देखेंगे। लेकिन बाद के धागे नहीं होंगे। प्रारंभकर्ता केवल पहले धागे के लिए काम करता है। तो आप यह जांचने के लिए कोड लिखना चाहते हैं कि यह प्रारंभ हुआ है या नहीं।

ThreadLocal<T> आपको प्रारंभिक फ़ंक्शन (रीड के ब्लॉग शो के रूप में) की आपूर्ति करने के द्वारा उस समस्या को हल करता है जो आइटम को पहली बार एक्सेस होने से पहले चलाया जाता है।

मेरी राय में, ThreadLocal<T> के बजाय [ThreadStatic] का उपयोग करने का कोई फायदा नहीं है।

+10

शायद ['थ्रेडलोकल '] (http://msdn.microsoft.com/en-us/library/dd642243 (v = vs.110) .aspx) .NET में उपलब्ध है 4 और ऊपर, और [थ्रेडस्टैटिक 'विशेषता] (http://msdn.microsoft.com/en-us/library/system.threadstaticattribute (v = vs.100) .aspx) 3.5 और नीचे भी उपलब्ध है। – Jeroen

+0

और यदि आप मान सेट करने के लिए प्रारंभकर्ताओं का उपयोग नहीं कर रहे हैं, लेकिन प्रारंभिक होने के बाद इसे बाद के बिंदु पर सेट कर रहे हैं, [थ्रेडस्टैटिक] का उपयोग करके वाक्य रचनात्मक रूप से क्लीनर है। – Thought

+0

'[थ्रेडस्टैटिक] 'का कोड कोड में उस क्षेत्र के मौजूदा संदर्भों को बदलने के लिए लाभ नहीं है। – NextInLine

23

थ्रेडस्टैटिक केवल पहले थ्रेड पर प्रारंभ करें, थ्रेडलोकल प्रत्येक थ्रेड के लिए प्रारंभ करें।

public static ThreadLocal<int> _threadlocal = 
     new ThreadLocal<int>(() => 
     { 
      return Thread.CurrentThread.ManagedThreadId; 
     }); 

    public static void Main() 
    { 
     new Thread(() => 
     { 
      for (int x = 0; x < _threadlocal.Value; x++) 
      { 
       Console.WriteLine("First Thread: {0}", x); 
      } 
     }).Start(); 

     new Thread(() => 
     { 
      for (int x = 0; x < _threadlocal.Value; x++) 
      { 
       Console.WriteLine("Second Thread: {0}", x); 
      } 
     }).Start(); 

     Console.ReadKey(); 
    } 

enter image description here

+2

दिलचस्प उदाहरण लेकिन मुझे बहाव मिलता है। – Eniola

7

ThreadStatic के पीछे मुख्य विचार प्रत्येक थ्रेड के लिए चर के अलग प्रतिलिपि बनाए रखने के लिए है: नीचे सरल प्रदर्शन है।

class Program 
    { 
     [ThreadStatic] 
     static int value = 10; 

     static void Main(string[] args) 
     { 
      value = 25; 

      Task t1 = Task.Run(() => 
      { 
       value++; 
       Console.WriteLine("T1: " + value); 
      }); 
      Task t2 = Task.Run(() => 
      { 
       value++; 
       Console.WriteLine("T2: " + value); 
      }); 
      Task t3 = Task.Run(() => 
      { 
       value++; 
       Console.WriteLine("T3: " + value); 
      }); 

      Console.WriteLine("Main Thread : " + value); 

      Task.WaitAll(t1, t2, t3); 
      Console.ReadKey(); 
     } 
    } 

ऊपर स्निपेट में, हम मुख्य थ्रेड सहित प्रत्येक थ्रेड के लिए value की एक अलग प्रतिलिपि है,।

enter image description here

तो, एक ThreadStatic चर धागा जिस पर यह बनाई गई है को छोड़कर अन्य धागे पर उसके डिफ़ॉल्ट मान प्रारंभ कर दिया जाएगा।

यदि हम प्रत्येक धागे पर चर को अपने तरीके से प्रारंभ करना चाहते हैं, तो थ्रेडलोकल का उपयोग करें।

+0

और पूरा लेख पाया जा सकता है [यहां] (http://putridparrot.com/blog/using-threadstatic-and-threadlocal/)। – dee

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