سؤال

تخيل أنك تستخدم التوازي في نظام متعدد النواة.

أليس من الممكن تمامًا تنفيذ نفس التعليمات في وقت واحد؟

خذ الرمز التالي:

int i = 0;

if( blockingCondition )
{
  lock( objLock )
  {
    i++;
  }
}

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

إذا كان الأمر كذلك ، كيف يمكنك ضمان التزامن عبر المعالجات؟

أيضا ، هل يعالج .NET TPL هذا النوع من التزامن؟ ماذا عن اللغات الأخرى؟

تعديليرجى ملاحظة أن هذا هو ليس حول المواضيع ، ولكن المهام والعملية المتوازية.

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

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

المحلول

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

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

في هذه المرحلة ، توقف "كيف تضمن المزامنة" عن أن تكون مشكلة لمبرمج التطبيق للقلق ، ويبدأ في أن تكون مشكلة لمصمم نظام التشغيل ومصمم الأجهزة.

إن زيادة ذلك هو ، كمبرمجة للتطبيق ، يمكنك أن تفترض بأمان أن "Lock (objlock)" ستكون مكالمة ذرية بغض النظر عن عدد وحدات المعالجة المركزية التي توصلت إليها في نظامك.

نصائح أخرى

لفهم سبب عمل هذا ، ضع في اعتبارك:

  1. قفل القفل (أي زيادة إشارة القفل على الكائن) هو عملية تحجب إذا كان الكائن مغلقًا بالفعل.

  2. خطوتين من lock, ، أ) التحقق من الإشارة إلى القفل مجاني ، ب) ويتم تنفيذ الكائن بالفعل ،'الوقت ذاته' - أي أنها متجانسة أو الذري العملية فيما يتعلق بالعلاقة بين وحدة المعالجة المركزية والذاكرة.

لذلك ، يمكنك أن ترى ذلك ، إذا أدخل 2 مؤشر ترابط الخاص بك if-block ، سيحصل أحد الخيوطين على القفل ، وسيحظر الآخر حتى ينتهي الأول من if.

إن اهتمامك هو بالضبط سبب حاجة إلى آلية خاصة مثل lock ولا يمكن ببساطة استخدام العلم المنطقي.

إن حل مشكلتك "المتزامنة" في الخوارزمية lock (الذي يدعو Monitor.Enter()) الاستخدامات. إنه يتضمن حواجز الذاكرة ومعرفة ميكانيكا الذاكرة المنخفضة للغاية للتأكد من أنه لا يمكن لأي مؤشرات ترابط 2 الحصول على القفل في نفس الوقت.

ملاحظة: أنا أتحدث عن .NET فقط ، وليس جافا.

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