我正在读考试,而且我对概念有困难。这是我给出的伪代码:
int mutex = 0;
do {
while (TestAndSet(&mutex));
// critical section
mutiex = 0;
// remainder section
} while (TRUE);
我的导师说,这个代码只满足三个必要条件中的两个(互斥,进度和有限等待),但我不明白哪一个没有得到满足......?
如何修改代码以支持解决关键区域问题的缺失条件?提前感谢任何见解!
答案 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的次数,以避免其他进程的饥饿......并且进程应该等待的时间必须有一个限制