থ্রেডস্ট্যাটিক বনাম থ্রেডলোকাল <T>: বৈশিষ্ট্যের চেয়ে জেনেরিক ভাল?


96

[ThreadStatic]ThreadLocal<T>জেনেরিক ব্যবহারের সময় অ্যাট্রিবিউট ব্যবহার করে সংজ্ঞায়িত করা হয় । কেন বিভিন্ন ডিজাইনের সমাধানগুলি বেছে নেওয়া হয়েছিল? এক্ষেত্রে জেনেরিক ওভার অ্যাট্রিবিউট ব্যবহারের সুবিধা এবং অসুবিধাগুলি কী?


4
Reedcopsey.com/2009/11/12/… দেখুন - যদিও প্রতিচ্ছবি এর সাথে এর কী আছে তা আমি দেখতে পাচ্ছি না ...
জন স্কিটি

উত্তর:


114

মন্তব্যগুলিতে ব্লগ পোস্টে উল্লিখিত কিছু স্পষ্ট করে না, তবে আমি খুব গুরুত্বপূর্ণ বলে মনে করি যে [ThreadStatic]এটি প্রতিটি থ্রেডের জন্য স্বয়ংক্রিয়ভাবে জিনিসগুলিকে আরম্ভ করে না। উদাহরণস্বরূপ, বলুন আপনার কাছে এটি রয়েছে:

[ThreadStatic]
private static int Foo = 42;

এটির প্রথম থ্রেডটি Fooআরম্ভ করা দেখতে পাবে 42। তবে পরবর্তী থ্রেডগুলি হবে না। ইনিশিয়ালাইজার কেবল প্রথম থ্রেডের জন্য কাজ করে। সুতরাং কোডটি শুরু হয়ে আছে কিনা তা পরীক্ষা করার জন্য আপনাকে শেষ করতে হবে।

ThreadLocal<T> আইটেমটি প্রথমবার অ্যাক্সেস করার আগে চালানো আপনাকে একটি আরম্ভকরণ ফাংশন সরবরাহ করার অনুমতি দেয় (যেমন রিডের ব্লগ শো করে) run

আমার মতে, এর [ThreadStatic]পরিবর্তে ব্যবহার করার কোনও সুবিধা নেই ThreadLocal<T>


20
সম্ভবত ছাড়া ThreadLocal<T>.NET 4 এবং তার পাওয়া যায়, এবং অ্যাট্রিবিউট এছাড়াও 3.5 এবং নীচের পাওয়া যায়। ThreadStatic
জেরোইন

4
এবং যদি আপনি মান নির্ধারণের জন্য আরম্ভকারী ব্যবহার না করে থাকেন, তবে পরিবর্তে [থ্রেডস্ট্যাটিক] ব্যবহার করে সিনট্যাক্টিক্যালি ক্লিনার করে আরম্ভের পরে কিছু পরে এটি সেট করছেন setting
চিন্তাধারা

9
এবং যে ব্যতীত ThreadLocal<T>কার্যকরী IDisposableএবং সাধারণত বাহিনী আপনি বাস্তবায়ন IDisposableপাশাপাশি, যা আপনার কলারের বাধ্য করে আপনি মীমাংসা করা এবং সেইজন্য বাস্তবায়ন IDisposableপাশাপাশি ...
স্টিফান Steinegger

4
@ স্টেফানস্টাইনগার: আমি পুলের থ্রেডগুলি ব্যবহার করে ThreadLocalবা তার ThreadStaticসাথে খুব সতর্কতা অবলম্বন করব । এই মানগুলি পুল থ্রেডের পুরো জীবন জুড়ে থাকবে, কেবল আপনি যে কাজটি অর্পণ করেছেন তা নয়। এটি আপনাকে বেশ কিছু অপ্রত্যাশিত উপায়ে সমস্যার কারণ হতে পারে। দেখুন stackoverflow.com/questions/561518/... আরও তথ্যের জন্য এবং অনুরূপ প্রশ্ন।
জিম মিশেল

4
উদাহরণের ক্ষেত্রটিও কি ঘোষণা করা উচিত নয় static? দেখুন msdn.microsoft.com/en-us/library/...
entheh

39

থ্রেডস্ট্যাটিক কেবল প্রথম থ্রেডে সূচনা করুন, প্রতিটি থ্রেডের জন্য থ্রেডলোকাল সূচনা করুন। নীচে সাধারণ বিক্ষোভ প্রদর্শন করা হচ্ছে:

    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();
    }

এখানে চিত্র বর্ণনা লিখুন


16

থ্রেডস্ট্যাটিকের পিছনে মূল ধারণাটি প্রতিটি থ্রেডের জন্য ভেরিয়েবলের পৃথক অনুলিপি বজায় রাখা ।

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প্রতিটি থ্রেডের মূল থ্রেড সহ আমাদের আলাদা আলাদা কপি রয়েছে।

এখানে চিত্র বর্ণনা লিখুন

সুতরাং, থ্রেডস্ট্যাটিক ভেরিয়েবলটি থ্রেডটি তৈরি করা থ্রেড বাদে অন্য থ্রেডগুলিতে তার ডিফল্ট মানতে শুরু করা হবে।

আমরা যদি প্রতিটি নিজস্ব থ্রেডে ভেরিয়েবলটি শুরু করতে চাই তবে থ্রেডলোকাল ব্যবহার করুন।


4
এবং সম্পূর্ণ নিবন্ধ এখানে পাওয়া যাবে
ড্যানিয়েল ডুয়েক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.