我学对考试和我在与一个概念困难。这是伪代码我给出:

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

我的教练说,只有两三个必要条件(互斥,进度和有限等待)全部满足与此代码,但我不知道哪一个没有被满足......?

应该如何代码被修改以支持缺少的条件,解决了临界区域的问题?预先感谢任何见解!

有帮助吗?

解决方案

如果有人认为这寻找答案,上面的代码不支持有限等待(必须有一个结合上的过程必须等待的时间量)。这是正确的代码,以确保所有的三个条件都满足,以确保使用synchronyzation 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);

其他提示

所有不错的小例子的第一,但检查并设置布尔需要指定参数和默认互斥设定为FALSE。所以int mutex=0实际上是boolean mutex=FALSE.The上面的代码确实有互斥和进步,但不限定等待。此外,您的testandset的定义是错误的。它应该是target=TRUE和不target=TRUE

是因为互斥应该使用原子加载和存储指令,使得存储器访问不被重新排序来设置?一组指令手段的原子执行的 指令被视为可以不被中断的单个步骤。

// 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