سؤال

أنا أدرس لامتحان وأواجه صعوبة في مفهوم. هذا هو رمز الزائفة الذي أعطيته:

int mutex = 0;
do {
  while (TestAndSet(&mutex));
  // critical section
  mutiex = 0;
  // remainder section
} while (TRUE);

يقول مدربي أن اثنين فقط من الشروط الثلاثة اللازمة (الاستبعاد المتبادل والتقدم والانتظار المحدودة) يقابلان هذا الرمز ، لكنني لا أفهم أيهما لم يتم تلبية ... ؟؟

كيف ينبغي تعديل الكود لدعم الحالة المفقودة لحل مشكلة المنطقة الحرجة؟ شكرا مقدما على أي نظرة ثاقبة!

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

المحلول

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

do{
  waiting[i] = TRUE;
  key = TRUE;
  while(waiting[i] && key)
    key = TestAndSet(&lock);
  waiting[i] = FALSE;

  // Critical Section

  j = (i + 1) % n;
  while ((j != i) && !waiting[j])
    j = (j+1) % n;

  if (j == i )
    lock = FALSE;
  else
    waiting[j] = FALSE;

  // Remainder Section
} while (TRUE);

نصائح أخرى

بادئ ذي بدء ، مثال صغير لطيف ، لكن TestAndets يأخذ args منطقية وتم تعيين Mutex افتراضيًا FALSE. لذا int mutex=0 هو في الواقع boolean mutex=FALSE. الرمز أعلاه لديه استبعاد متبادل والتقدم ولكن لا يحد الانتظار. أيضا تعريفك لـ testandset خطأ. يجب أن يكون target=TRUE و لا target=TRUE.

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

// example process using mutual exclusion
void process() {
  int mutex;
  init_lock (&mutex);
  do {
    lock (&mutex);
    // critical section
    unlock (&mutex);
    //remainder section
  } while(TRUE);
}

// mutual exclusion functions
void init_lock (int *mutex) {
  *mutex = 0;
}

void lock (int *mutex) {
  while(TestAndSet(mutex))
}

void unlock (int *mutex) {
  *mutex = 0;
}

int TestAndSet(*target) {
  int rv = *target;
  *target = 1;
  return rv;
}

مجرد النظر إليه ، يبدو أن الوظائف تفعل نفس الشيء مثل رمز العينة المنشور سابقًا ، لكنني أعتقد أن بهذه الطريقة يضمن الاستبعاد المتبادل لأن الوظائف التي تعمل على *الهدف هي ذرية ... ؟؟

عذرا أي أخطاء أخطاء أخطاء أخطاء ...

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

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