السلامة الخيط ... ما هو مسار عمل "أفضل" الخاص بي؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

أنا أتساءل ما هو طريقة "الأفضل" لجعل مؤشر ترابط البيانات آمنة.

على وجه التحديد، أحتاج إلى حماية قائمة مرتبطة عبر مؤشرات الترابط متعددة - قد يحاول مؤشر ترابط واحد قراءته أثناء قيام مؤشر ترابط آخر بإضافة / يزيل البيانات منه، أو حتى يحرر القائمة بأكملها. لقد قرأت عن الأقفال؛ يبدو أنهم النهج الأكثر استخداما، ولكن يبدو أنهم يمكن أن يكونوا مشكلة (الجمود الجمود). لقد قرأت أيضا عن العمليات الذرية وكذلك التخزين المحلي للخيط.

في رأيك، ماذا سيكون أفضل مسارتي للعمل؟ ما هو النهج الذي يستخدمه معظم المبرمجين، وما سبب ذلك؟

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

المحلول

نهج واحد غير مستخدم بشكل كبير، ولكن الصوت تماما، هو تعيين موضوع واحد خاص للأغراض الخاصة لامتلاك كل هيكل "مشترك". هذا الخيط يجلس عموما في انتظار (آمنة للخيط ؛-) قائمة الانتظار، على سبيل المثال في بيثون أ Queue.Queue مثيل، لطلبات العمل (قراءة أو تغيير الهيكل المشترك)، بما في ذلك تلك التي تطلب استجابة (سوف تمر في قائمة انتظارهم التي يتم وضع الاستجابة عليها عند الاستعداد) وتلك التي لا تفعل ذلك. هذا النهج يسقط بالكامل جميع الوصول إلى المورد المشترك، يستعيد بسهولة إلى العمارة المتعددة أو العمارة الموزعة (تقريبا بلاغة، في بيثون، مع multiprocessing؛-)، والضمان تماما السلامة ونقص الجمود وكذلك ظروف السباق طالما أن كائن قائمة الانتظار الأساسي مبرمجة جيدا مرة واحدة وإلى الأبد.

إنه يحول في الأساس إلى جحيم هياكل البيانات المشتركة في جنة هياكل التزامن المارة للرسائل.

أوتوه، إنه مايو يكون TAD أعلى النفقات العامة من التباطؤ بهذه الطريقة الصعبة مع أقفال و C ؛-).

نصائح أخرى

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

إليك رابط لمبة بلوق يناقش مجموعات ثابتة ورابطا لبعض التطبيقات في .NET.

http://blogs.msdn.com/jaredpar/archive/2009/04/06/imutable-vs-mutable-collection-performance.aspx.

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

بعد ذلك، تذكر قواعد الإبهام:

  • ابحث عن جميع المتغيرات / المتغيرات العالمية الخاصة بك على كومة.
  • تأكد من إعادة الروتينات الفرعية الخاصة بك إعادة الدخول.
  • تأكد من إمكانية الوصول إلى البيانات المشتركة.
  • تأكد من عدم وجود وصول غير مباشر من خلال المؤشرات.

(أنا متأكد من أن الآخرين يمكنهم إضافة المزيد.)

طريقة "الأفضل"، من وجهة نظر أمان، هي وضع قفل على بنية البيانات بأكملها، بحيث يمكن لخيط واحد فقط لمسه في وقت واحد.

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

اقتراحي هو

  1. ابدأ في قفل عالمي على بنية البيانات الخاصة بك. الملف الشخصي الخاص بك لمعرفة ما إذا كانت مشكلة حقا.

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

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

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