如何使用检查并设置()为解决临界区问题?
-
25-09-2019 - |
题
我学对考试和我在与一个概念困难。这是伪代码我给出:
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;
}
只是看着它,它看来,功能做同样的事情作为示例代码早些时候发布的,但我想这样可以确保相互排斥,因为在*目标,操作功能是原子... ??
打扰任何错字...
有界等待这里没有满足。你可以看到有必须在一个特定的进程可以进入临界区,序到其他进程的避免饥饿的次数约束...并必须有一个约束的时间进程应等待
不隶属于 StackOverflow