هي أنواع البيانات البدائية في C # الذرية (خيط آمن)؟

StackOverflow https://stackoverflow.com/questions/2433772

سؤال

على سبيل المثال، هل أحتاج إلى قفل 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؟

MSDN Frimitivetype الفئة

وهنا رابط مفيد آخر قد يكون اهتماما أيضا، أجد الحل مقنعة للغاية: حتى السؤال: كيف أعرف ما إذا كانت طريقة C # هي خيط آمن؟

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