如何使用TestAndSet()来解决临界区问题?

时间:2010-04-06 23:57:33

标签: synchronization operating-system test-and-set

我正在读考试,而且我对概念有困难。这是我给出的伪代码:

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

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

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

首先是一个很好的小例子,但testandset采用布尔args,默认情况下,mutex设置为FALSE。所以int mutex=0实际上是boolean mutex=FALSE。上面的代码确实有互斥和进步,但没有限制等待。您对testandset的定义也是错误的。它应该是target=TRUE而不是target=TRUE

答案 2 :(得分: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上运行的函数是原子的...... ??

原谅任何错别字......

答案 3 :(得分:0)

这里没有遇到有限的等待。你可以看到必须绑定特定进程进入Critical Section的次数,以避免其他进程的饥饿......并且进程应该等待的时间必须有一个限制