سؤال

يتم الوصول إلى أ منطقي المجال الذري في C #؟على وجه الخصوص، هل أحتاج إلى وضع قفل حول:

class Foo
{
   private bool _bar;

   //... in some function on any thread (or many threads)
   _bar = true;

   //... same for a read
   if (_bar) { ... }
}
هل كانت مفيدة؟

المحلول

نعم.

القراءة والكتابة لأنواع البيانات التالية هي ذرية:الأنواع bool وchar وbyte وsbyte وshort وushort وuint وint وfloat والأنواع المرجعية.

كما وجدت في مواصفات لغة C#.

يحرر:ربما يكون من المفيد أيضًا فهم متقلب الكلمة الرئيسية.

نصائح أخرى

كما هو مذكور أعلاه، يعتبر bool ذريًا ولكنك لا تزال بحاجة إلى تذكر أنه يعتمد أيضًا على ما تريد فعله به.

if(b == false)
{
    //do something
}

ليست عملية ذرية تعني أن قيمة B يمكن أن تتغير قبل تنفيذ مؤشر الترابط الحالي الرمز بعد العبارة IF.

إن عمليات الوصول المنطقية هي بالفعل ذرية، لكن هذه ليست القصة بأكملها.

لا داعي للقلق بشأن قراءة قيمة "مكتوبة بشكل غير كامل" - ليس من الواضح ما الذي يمكن أن يعنيه ذلك بالنسبة للمنطق على أي حال - ولكن لا داعي للقلق بشأن ذاكرة التخزين المؤقت للمعالج، على الأقل إذا كانت تفاصيل التوقيت مشكلة.إذا كان الخيط رقم 1 يعمل على النواة A _bar في ذاكرة التخزين المؤقت، و _bar يتم تحديثه بواسطة مؤشر الترابط رقم 2 الذي يعمل على نواة أخرى، ولن يرى الخيط رقم 1 التغيير على الفور إلا إذا قمت بإضافة قفل، أعلن _bar مثل volatile, ، أو أدخل المكالمات بشكل صريح إلى Thread.MemoryBarrier() لإبطال القيمة المخزنة مؤقتًا.

النهج الذي استخدمته، وأعتقد أنه صحيح، هو

volatile bool b = false;

.. rarely signal an update with a large state change...

lock b_lock
{
  b = true;
  //other;
}

... another thread ...

if(b)
{
    lock b_lock
    {
       if(b)
       {
           //other stuff
           b = false;
       }
     }
}

كان الهدف في الأساس هو تجنب الاضطرار إلى قفل كائن بشكل متكرر في كل تكرار فقط للتحقق مما إذا كنا بحاجة إلى قفله من أجل توفير كمية كبيرة من معلومات تغيير الحالة والتي تحدث نادرًا.أنا يفكر هذا النهج يعمل.وإذا كان الاتساق المطلق مطلوبا، أنا يفكر المتقلبة ستكون مناسبة على b bool.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top