থ্রেডস্ট্যাটিক অ্যাট্রিবিউট কীভাবে কাজ করে?


138

[ThreadStatic]বৈশিষ্ট্য কীভাবে কাজ করে? আমি ধরে নিয়েছিলাম যে সংকলকটি টিএলএস-তে মান পুনরুদ্ধার করতে কিছু আইএল নির্গত করবে, তবে একটি বিচ্ছিন্নতার দিকে তাকালে মনে হয় না এটি সে স্তরে এটি করবে।

ফলোআপ হিসাবে, আপনি যদি অ-স্থিতিশীল সদস্যকে রাখেন তবে কী হবে? আমাদের একজন বিকাশকারী সেই ভুলটি করেছিল এবং সংকলক এমনকি কোনও সতর্কতাও দেয় না।

হালনাগাদ

দ্বিতীয় প্রশ্নের উত্তর এখানে দেওয়া হয়েছে: থ্রেডস্ট্যাটিক স্ট্যাটিক সি # দিয়ে পরিবর্তিত হয়েছে


1
যদি উত্পাদিত আইএল একই হয় (যা প্রকৃতপক্ষে এটি) তবে রানটটাইমটি যখন সজ্জিত ক্ষেত্রটি থেকে সজ্জিত হয় তখন মূল্য কীভাবে বরাদ্দ করতে হয় এবং কীভাবে পড়তে হয় তা নির্দিষ্টভাবে কোড করতে হবে। হ্যাকের মতো মনে হচ্ছে :)
রেক্স এম

উত্তর:


92

থ্রেড স্ট্যাটিকের বাস্তবায়ন শব্দার্থসমূহ। নেট জিট সংকলকটিতে আইএল স্তরের নীচে below আইবিতে ভিবি.এনইটি এবং সি # এর মতো নির্গমনকারী সংকলকগুলিকে থ্রডস্ট্যাটিক বৈশিষ্ট্যযুক্ত একটি চলক পড়তে এবং লিখতে পারে এমন আইএল কোড নির্গত করতে উইন 32 টিএলএস সম্পর্কে কিছু জানতে হবে না। সি # যতদূর জানে ভেরিয়েবল সম্পর্কে বিশেষ কিছুই নেই - এটি স্টাফ পড়ার এবং লেখার জন্য কেবল একটি অবস্থান। এটির উপর এটির একটি বৈশিষ্ট্য রয়েছে এ বিষয়টি সি # এর কোনও ফল নয়। সি # কেবলমাত্র প্রতীক নামের আইএল পড়তে বা লিখতে নির্দেশগুলি নির্গত করতে জানতে হবে।

'ভারী উত্তোলন' মূল সিএলআর দ্বারা করা হয় যা কোনও নির্দিষ্ট হার্ডওয়্যার আর্কিটেকচারে আইএলকে কাজ করার জন্য দায়ী।

এটি আরও ব্যাখ্যা করবে যে কেন অনুপযুক্ত (অ-স্থিতিশীল) চিহ্নটিতে অ্যাট্রিবিউটটি স্থাপন করা সংকলকটির কাছ থেকে প্রতিক্রিয়া পায় না। সংকলকটি বিশেষণটির কী বিশেষ শব্দার্থ প্রয়োজন তা জানে না। কোড বিশ্লেষণ সরঞ্জামগুলির মতো এফএক্স / কপ, যদিও এটি সম্পর্কে জানা উচিত।

এটি দেখার আরেকটি উপায়: সিআইএল স্টোরেজ স্কোপের একটি সেট নির্ধারণ করে: স্ট্যাটিক (গ্লোবাল) স্টোরেজ, সদস্য স্টোরেজ এবং স্ট্যাক স্টোরেজ storage টিএলএস সেই তালিকায় নেই, খুব সম্ভবত কারণ এই তালিকায় টিএলএস থাকার দরকার নেই। আইএল পড়ার এবং লেখার নির্দেশাবলী যদি টিএলএস অ্যাক্সেসের জন্য পর্যাপ্ত হয় যখন প্রতীকটি টিএলএস বৈশিষ্ট্যের সাথে ট্যাগ করা হয়, তবে আইএলটির টিএলএসের জন্য কোনও বিশেষ প্রতিনিধিত্ব বা চিকিত্সা কেন করা উচিত? এটি প্রয়োজন হয় না।


কিন্তু টিএলএস-এর সেই বিশেষ, বাস্তবায়ন-নির্দিষ্ট আচরণটি। নেট / সিএলআর-এর "যাচাইযোগ্য" বিক্রয়-পয়েন্টকে পুরোপুরি বিকৃত করে না?
দাই

116

[থ্রেডস্ট্যাটিক] বৈশিষ্ট্য কীভাবে কাজ করে?

আপনি ভাবতে পারেন যে থ্রেডস্ট্যাটিকের সাথে চিহ্নিত ক্ষেত্রটি একটি থ্রেডের সাথে সংযুক্ত এবং এর জীবনকাল একটি থ্রেডের জীবনকালের সাথে তুলনীয়।

সুতরাং সিউডোকোডে ThreadStaticথ্রেডের সাথে কী-মান যুক্ত হওয়ার অনুরূপ (শব্দার্থবিজ্ঞানের দ্বারা):

Thread.Current["MyClass.myVariable"] = 1;
Thread.Current["MyClass.myvariable"] += 1;

তবে সিনট্যাক্সটি কিছুটা সহজ:

class MyClass {
  [ThreadStatic]
  static int myVariable;
}
// .. then
MyClass.myVariable = 1;
MyClass.myVariable += 1;

আপনি যদি অ-স্থিতিশীল সদস্যকে রাখেন তবে কী হবে?

আমি বিশ্বাস করি এটি উপেক্ষা করা হয়েছে:

    class A {
        [ThreadStatic]
        public int a;
    }
    [Test]
    public void Try() {
        var a1 = new A();
        var a2 = new A();
        a1.a = 5;
        a2.a = 10;
        a1.a.Should().Be.EqualTo(5);
        a2.a.Should().Be.EqualTo(10);
    }

অতিরিক্তভাবে এটি উল্লেখযোগ্য যে ThreadStaticসাধারণ স্থিতিশীল ক্ষেত্রের তুলনায় কোনও সুসংগত ব্যবস্থা প্রয়োজন হয় না (কারণ রাষ্ট্রটি ভাগ করে নেই)।


1
সিউডো কোডের মতো দ্বিতীয়টি হওয়া উচিত "MyClass.myVariable", তাই না?
akshay2000

আমি নিশ্চিত না যে সঠিক সীমাবদ্ধতা, তবে আমি কেবল এটি উল্লেখ করতে চেয়েছিলাম যদি এটি স্পষ্ট না হয় যে এটি কোনও আদিম ধরণের হতে হবে না। আপনি যদি উত্সের দিকে তাকান তবে TransactionScopeতারা সুযোগের জন্য সেখানে সমস্ত প্রকারের জিনিসপত্র সংরক্ষণ করে ( রেফারেন্সসোর্স.মাইক্রোসফট
# সিস্টেমেট্রান্সঅ্যাকশনস

10

[থ্রেডস্ট্যাটিক] প্রতিটি থ্রেডে একই ভেরিয়েবলের বিচ্ছিন্ন সংস্করণ তৈরি করে।

উদাহরণ:

[ThreadStatic] public static int i; // Declaration of the variable i with ThreadStatic Attribute.

public static void Main()
{
    new Thread(() =>
    {
        for (int x = 0; x < 10; x++)
        {
            i++;
            Console.WriteLine("Thread A: {0}", i); // Uses one instance of the i variable.
        }
    }).Start();

    new Thread(() =>
   {
       for (int x = 0; x < 10; x++)
       {
           i++;
           Console.WriteLine("Thread B: {0}", i); // Uses another instance of the i variable.
       }
   }).Start();
}

3

ক্ষেত্রটি চিহ্নিত [ThreadStatic]করে থ্রেড লোকাল স্টোরেজ তৈরি করা হয়েছে যাতে প্রতিটি থ্রেডের নিজস্ব ক্ষেত্রের অনুলিপি থাকে অর্থাৎ ক্ষেত্রগুলির পরিধি থ্রেডের স্থানীয় হয়।

টিএলএস ক্ষেত্রগুলি জিএস / এফএস সেগমেন্টগুলির রেজিস্টারগুলির মাধ্যমে অ্যাক্সেস করতে পারে thread এই বিভাগগুলি থ্রেড-নির্দিষ্ট মেমরির অ্যাক্সেস করতে ওএস কার্নেলগুলি ব্যবহার করে। এটি ওএস কার্নেল দ্বারা সম্পন্ন হয়।

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