ماذا تعني الكلمة "volatile" في #C ؟الكلمة الأساسية "volatile" تشير إلى أن "الحقل" يمكن أن يطرأ
عليه تعديلات من قبل "threads" متعددة في نفس الوقت، الحقول
التي تم تعريفها "volatile" لا تخضع لتحسينات المترجم (compiler)
التي تفترض وصول "thread" واحدة للحقل، هذا يضمن أن آخر قيمة
محدثة موجودة في "الحقل" في جميع الأوقات.
تستعمل كلمة "volatile" عادة على "الحقول" التي سيتم الوصول
إليها بـ "threads" متعددة، الكلمة الأساسية "volatile" يمكن
تطبيقها على "الحقول" من هذه الأنواع :
المراجع (Reference types)
المؤشرات (Pointer types) { في سياق 'غير آمن' (unsafe context) }
الأنواع مثل (sbyte, byte, short, ushort, int, uint, char, float, bool)
enum بهذه الأنواع الأساسية (byte, sbyte, short, ushort, int, uint)
كل الأنواع العامة المعروفة بـ 'المراجع' (Reference types)
بما في ذلك أنواع 'المراجع' (IntPtr, UIntPtr)
الكلمة "volatile" يمكن أن تطبق فقط على حقول الـ "class" أو الـ "struct". الحقول المحلية "locals" لا يمكن أن تعرف على أنها "volatile". لماذا نستعمل "volatile" : المترجم (the compiler) يقوم بالعديد من التحسينات في الخلف
بعض هذه التحسينات قد تعيد ترتيب القيم المتراكمة للـ "حقل" أي نظريا في حال كانت هناك "threads" متعددة تصل لقيمة الحقل في نفس الوقت يمكن لأحد منهم أن تقرأ قيمة الحقل التي في الحقيقة قد تغيرت قبل بضع أجزاء من الثانية، أي أن أحدى الـ "threads" ستقرأ قيمة "كانت" موجودة عوض القيمة "الحالية" للحقل، "volatile" ستضمن عدم حدوث هذا "التحسين" الذي قد يكون سئ للغاية حيث ستخبر الكومبايلر بأن لا يجرى هذا "التحسين" على "الحقل" المقصود. ما هي الكلمة المعادلة لـ "volatile" في VB.NET ؟ لا يوجد كلمة أساسية معادلة لـ "volatile" في الـ vb.net
في الـ #C كلمة "volatile" فقط تخبر الكومبايلر بأن يتعامل
مع الحقل بشكل مختلف في الـ vb.net يمكن القيام بهذا 'يدويا'.
المثال التالي لا يجسد خطأ يمكن أن يحدث إذا إستغنينا عن "volatile"
بل فقط يجسد كيفية تنفيذ آلية "volatile" في الـ vb.net يدويا،
السبب وراء عدم إنتاج كود يظهر مخاطر عدم إستعمال "volatile"
هو أنه من النادر جدا أن نجعل 'عن قصد' عدد مختلف من الـ "threads"
تصل لحقل ما في نفس الوقت و لكن هذا يكاد يحدث في كل وقت
عندما نستعمل الـ "multithreading" و هذا يمكن أن يكون خطيرا جدا.
منقول