هل من الآمن تجاهل حالة سباق القراءة والكتابة المتمثلة في تغيير قيمة النقطة العائمة بسلاسة؟
-
22-09-2019 - |
سؤال
بينما أحاول وضع وظيفة تحديث الرسوم المتحركة ومحاكاة الفيزياء لمحرك اللعبة في مؤشر ترابط منفصل للتنفيذ ، أدرك حالة السباق المحتملة لبعض قيم النقاط العائمة (على سبيل المثال ، موضع كائن) بين مؤشر ترابط الكاتب (الرسوم المتحركة ، الفيزياء ) وخيط القارئ (العارض) إذا كان كلا الموضوعين سيقومان بالوصول إلى القيم في وقت واحد.
سؤالي هو ، بالنظر إلى أنه حتى مهمة النقطة العائمة ليست ذرية ، هل يمكن أن تؤدي حالة سباق القراءة والكتابة إلى تغيير سلكي/مفاجئ للقيم الأصلية المتغيرة بسلاسة كما يراها القارئ؟
علاوة على ذلك ، في وضعي ، يمكنني التسامح مع كمية صغيرة من الخطأ ، لأن مثل هذا الخطأ لن يتراكم خلال إطار العرض التالي.
المحلول
من الناحية النظرية ، يمكنك الحصول على درجة هائلة من الخطأ إذا كان هناك مفتاح سياق بين تحديث الأسس وتحديث Mantissa ، لكنني أشك في أن معظم المنصات أو البنى المستخدمة اليوم تسمح بحدوث شيء.
نصائح أخرى
من أجل فهمي ، يمكنك تجاهل حالة السباق طالما كان لديك فقط على موضوع الكتابة في وقت واحد ولا تهتم إذا كان مؤشر ترابط القراءة (قوائم) لا تستخدم أحدث إصدار.
من فهمي ، يجب أن تكون كتابة الطفو ذرية إلى الكود الخاص بك ، على الرغم من أن هذا قد يعتمد على النظام الأساسي.
القسم 12.5 من ECMA-334 (تحديد لغة C#) ينص على:
تقرأ وتكتب أنواع البيانات التالية يجب أن تكون ذرية: Bool ، Char ، Byte ، Sbyte ، Short ، Ushort ، Uint ، Int ، Float ، والمرجع.
تحقيقًا لهذه الغاية ، يجب ألا ترى أي فساد بسبب القراءة والكتابة عن تعويم (على افتراض أنك لا تعني الضعف هنا ، وهذا هو ليس مضمونة أن تكون كتابة ذرية).
ومع ذلك ، ما تجدر الإشارة إليه هو أنه على الرغم من أن كتابة القيم مضمونة لتكون ذرية ، فإن ترتيب القراءات/يكتب ليس مضمون ما لم تكن تستخدم شيئًا محددًا ، مثل مكالمة إلى مراقب.
مراقب الكلمة الرئيسية المتقلبة عند إعلان المتغير. على افتراض قراءة/كتابة هذا المتغير هو الشيء الوحيد الذي يجب أن يحدث ، سيضمن أن يتم القراءة/الكتابة بالترتيب.