سؤال

لدي تطبيق متعدد مؤشرات الترابط مكتوب بلغة Ruby ويشارك في بعض متغيرات المثيلات.تعد عمليات الكتابة إلى هذه المتغيرات نادرة (1٪) بينما تكون عمليات القراءة شائعة جدًا (99٪). ما هي أفضل طريقة (سواء في رأيك أو بطريقة روبي الاصطلاحية) للتأكد من أن هذه المواضيع ترى دائمًا أحدث القيم المعنية؟ إليك بعض الأفكار التي طرحتها حتى الآن (على الرغم من أنني أرغب في الحصول على مدخلاتك قبل أن أقوم بإصلاح هذا):

  • احصل على القفل الأكثر استخدامًا قبل قراءة أو كتابة أي من هذه المتغيرات (from جافا التزامن في الممارسة العملية).الجانب السلبي لهذا هو أنه يضع الكثير من synchronize الكتل في الكود الخاص بي ولا أرى طريقة سهلة لتجنبها.
  • استخدم روبي freeze الطريقة (انظر هنا)، على الرغم من أنه يبدو مرهقًا بنفس القدر ولا يمنحني أيًا من مزايا المزامنة التي يوفرها الخيار الأول.

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

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

المحلول

يعد استخدام القفل هو الطريقة الأكثر ملاءمة للقيام بذلك.يمكنك مشاهدة هذا العرض التقديمي الذي قدمه Jim Weirich حول هذا الموضوع: ما يجب أن يعرفه جميع مستخدمي Rubyist عن الخيوط.

كما أن تجميد الكائن لن يساعدك هنا لأنك تريد تعديل هذه المتغيرات.تجميدهم في مكانهم يعني ذلك لن يتم تطبيق أي تعديلات أخرى عليها (وبالتالي لن تنجح نسبة 1% من عمليات الكتابة).

نصائح أخرى

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

يعد قفل القارئ والكاتب مشكلة شائعة ولها حل محدد جيدًا:

قفل القراء والكاتب

وهناك العديد من التطبيقات عليه:

كتابة نمط القفل

لا ترغب في وضع قفل لكل قراءة/كتابة

يجب عليك استخدام Mutex لمزامنة الوصول إلى الحالة المشتركة.حقا لا توجد وسيلة لتجنب القيام بذلك.

في الأجهزة الحديثة متعددة النواة، لا يمكنك وضع أي افتراضات حول كيفية الوصول إلى الذاكرة أو كيفية تفاعل الوصول إلى الذاكرة مع التخزين المؤقت.

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