0

我正在为考试而学习,但我在概念上遇到了困难。这是给我的伪代码:

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

我的导师说这段代码只有三个必要条件(互斥、进度和有限等待)中的两个满足,但我不明白哪个没有满足......??

应该如何修改代码以支持缺失条件来解决关键区域问题?提前感谢您的任何见解!

4

4 回答 4

3

如果有人看到这个在寻找答案,那么上面的代码不支持有限等待(进程必须等待的时间量必须是有限的)。这是确保满足所有三个条件以确保使用 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);
于 2010-04-07T16:53:01.040 回答
1

首先是很好的小例子,但 testandset 采用布尔参数,默认情况下互斥锁设置为FALSE. int mutex=0实际上也是如此boolean mutex=FALSE。上面的代码确实有互斥和进度,但没有有限等待。你的定义testandset也是错误的。它应该是target=TRUE而不是target=TRUE

于 2012-09-12T16:18:30.583 回答
0

是否因为应该使用原子 LOAD 和 STORE 指令设置互斥锁,以便不会重新排序内存访问?一组指令的原子执行意味着指令被视为一个不能被中断的单步。

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

只看它,似乎这些函数与之前发布的示例代码执行相同的操作,但我想这种方式可以确保互斥,因为在 *target 上运行的函数是原子的......??

有错别字见谅...

于 2010-04-07T00:47:12.580 回答
0

这里不满足有限等待。你可以看到一个特定进程可以进入临界区的次数必须有限制,以避免其他进程的饥饿......并且必须有一个进程应该等待的时间限制

于 2013-01-12T08:59:19.390 回答