هي أنواع البيانات البدائية في C # الذرية (خيط آمن)؟
-
19-09-2019 - |
سؤال
على سبيل المثال، هل أحتاج إلى قفل bool
قيمة عند تعدد متعددة؟
المحلول
لا يوجد شيء مثل الذرية اكتب. وبعد فقط عمليات يمكن أن تكون ذرية.
قراءة وكتب نوع بيانات يناسب كلمة واحدة (int
على معالج 32 بت، long
على معالج 64 بت) من الناحية الفنية "الذرية"، ولكن يمكن أن يقرر الرثث و / أو المعالج إعادة ترتيب التعليمات، وبالتالي إنشاء ظروف سباق غير متوقعة، لذلك تحتاج إلى تسلسل الوصول مع lock
, ، استخدم ال Interlocked
فئة للكتابة (وفي بعض الحالات يقرأ)، أو تعلن المتغير volatile
.
الجواب القصير هو: إذا كان اثنين من مؤشرات الترابط المختلفة قد الوصول إلى نفس الحقل / المتغير، وسوف يكتب واحد منهم على الأقل، تحتاج إلى استخدام نوع من القفل. لأنواع بدائية وهذا هو عموما Interlocked
صف دراسي.
نصائح أخرى
سؤال مماثل هنا
للحصول على إجابة نهائية الذهاب إلى المواصفات. :)
القسم الأول، القسم 12.6.6 من المواصفات CLI: "يجب أن تضمن CLI مطابقة أن القراءة والكتابة الوصول إلى مواقع الذاكرة المحاذاة بشكل صحيح، لا أكبر من حجم الكلمة الأصلية ذرية عندما تكون جميع الوصول إلى الموقع بنفس الحجم "
بحيث تؤكد أن s_initialized لن تكون غير مستقرة أبدا، والقراءة والكتابة لأنواع Primitve هي ذرية.
Interlocking يخلق حاجز ذاكرة لمنع القراءة من المعالج من REORDING ويكتب. القفل يخلق الحاجز الوحيد المطلوب في هذا المثال.
يوحنا.
في الأساس، لن يكون لديك مشكلة "تحطم" من عدم قفل BOOL. ما قد يكون لديك شرط سباق لترتيب تحديث BOOL أو قراءة. إذا كنت ترغب في Caruntee أن Bool مكتوب على / قراءة من خلال ترتيب معين، فأنت تريد استخدام نوع من آلية القفل.
نوعا ما. هناك موضوع ممتاز حول هذا الموضوع هنا, ، ولكن النسخة القصيرة هي، في حين أن القراءة أو الكتابة المعينة قد تكون ذرية، وهذا تقريبا ما تفعله. على سبيل المثال، إذا كنت ترغب في زيادة عدد صحيح، فأنت بحاجة إلى 1) اقرأ القيمة، 2) إضافة واحدة إلى القيمة و 3) تخزين القيمة مرة أخرى. يمكن مقاطعة أي من تلك العمليات.
هذا هو سبب الفصول مثل "المتشابكة".
أنواع البدائية الثابتة هي الخلافات، لذلك لا تحتاج إلى قفل تلك المتغيرات المكتوبة. ومع ذلك، فإن أي متغير مثيل من نوع بدائي غير مضمون ليكون. انظر هنا: هي أنواع بدائية مثل bool consafe؟
وهنا رابط مفيد آخر قد يكون اهتماما أيضا، أجد الحل مقنعة للغاية: حتى السؤال: كيف أعرف ما إذا كانت طريقة C # هي خيط آمن؟