سؤال

في التطبيق الذي أكتب فيه، أحتاج إلى كتابة الكثير من الأنواع الأساسية، والتي من المرجح أن تكون ثابتة. لكنني أتساءل كيف تقارن أنواع مختلفة من التطبيقات الموازية على تلك غير قابلة للتغيير.

يمكنك استخدام الأقفال مع كائنات متغيرة، أليس كذلك؟ كيف تقارن التقنيات الأخرى المستخدمة مع أنواع ثابتة في التطبيقات الموازية؟

أنت على الأقل بعيدا عن استخدام الأقفال مع أنواع ثابتة، أليس كذلك؟

هل كانت مفيدة؟

المحلول

أنواع

  • استخدم أنواعا ثابتة قدر الإمكان.
  • استخدم مجموعات آمنة للخيط بدلا من الأقفال الصريحة قدر الإمكان.
  • استخدم فقط أنواع متغيرة عندما لا يكون لديك أي خيار معقول آخر.

الخيوط

  • استخدم تجمعات الخيط قدر الإمكان.
  • استخدم حلقات لا نهاية لها عندما لا تكون تجمعات الخيط غير ممكنة.
  • ابدأ يدويا وإيقاف الخيوط كملاذ أخير.

إذا اضطررت إلى استخدام أقفال صريحة، وثابتها من خلالها. خاصة عندما يتعلق الأمر بالترتيب الذي تقوم فيه بإغلاق الكائنات. إذا كنت تعرف أن كائنات Foo مؤمنة دائما قبل كائنات الشريط وأن FOO (المفتاح 100) مؤمن دائما قبل FOO (مفتاح = 200)، فلن تحصل على Deadlocks.

نصائح أخرى

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

التحمل لا يؤثر على قفل.

عند استخدام أنواع مختلفة، فإنك تعريض أخطاء الكتابة بعد القراءة أو كتابة الكتابة. هذه أخطاء المزامنة المرتبطة بتحديث قيمة أثناء قراءة المواضيع الأخرى بشكل متزامن أو تحديث القيمة.

لمنع أخطاء المزامنة، يجب عليك استخدام شكل من أشكال آلية القفل. إذا كنت تستخدم قفل صريح، فستحتاج إلى أن تكون حذرا للغاية بشأن ترتيب الحصول على الأقفال. إذا لم تكن حريصا، فيمكنك إدخال Deadlocks. على سبيل المثال: Thread A LOCK LOCK X، فمن المؤشرات B يكتسب Lock Y. A Like مؤشر ترابط Lock Lock Y والخيط B يطلب قفل X. هذا يؤدي كلا من مؤشرات الترابط للانتظار إلى أجل غير مسمى للأقفال التي لن يتم إصدارها أبدا.

اثنين من قواعد جيدة للإبهام للقفل:

  • الحصول على أقفال في ترتيب معين (على سبيل المثال دائما اكتساب القفل x قبل قفل Y)
  • عقد أقفال لفترة قصيرة قدر الإمكان. اكتسابها عندما تحتاج إليهم، وإطلاق سراحهم بمجرد الانتهاء من ذلك.

إذا لم تكتب أبدا إلى كائن بعد إنشائه، فلن تحتاج إلى قفله قبل الوصول إليه. وبالتالي، لن تحتاج إلى قفل كائنات ثابتة.

استخدام أنواع ثابتة عندما تستطيع. استخدم أنواع متغيرة عندما تضطر إلى (التسلسل وما إلى ذلك).

استخدم System.Threading.Tasks لجميع الموازيات الخاصة بك - ستتم بناء المهام باللغة باللغة في C # 5 عند إضافة الكلمات الرئيسية ASYNC وانتظر.

كتبت مقالا عن أنواع قابلة للتغيير / غير قابل للتغيير في C #: http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-al-primutable-in-parallel-world/

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