0

我被要求写:以下情况的输入函数和退出函数:

有 N 个进程和 M 种进程(N>>M) 有一个临界区,所有相同类型的进程都可以进入。例如:如果A类型在cs中,则B类型不能进入cs。但所有类型为 A 的进程都可以进入。

我只能使用互斥锁和“类型”,这是进程的类型。不允许死锁。

你觉得这样好吗?

shared: this.type = -1;
mutex m, m1=1;

enter{
    down(m)
    if (this.type == process.type) up(m1)
    down(m1)
    this.type= process.type
    up(m)
}
exit {
    this.type = -1
    up(m1)
}

谢谢!(顺便说一句,这不是硬件。我有考试,我正在解决前几年的考试)

4

2 回答 2

0

我会说不,目前的方法不行。

具体来说,假设类型 0 进来,并通过输入。然后类型 1 在类型 0 退出之前通过。它命中互斥体,发现进程类型错误并锁定在 m1 上。然后类型 0 通过,解锁 m,重置进程类型,并且 m1 上的锁定仍然有效。

此外,如果您有 2 个类型为 0 的进程进入,则第一个退出将导致正在运行的进程类型被重置,而进程仍处于临界区。

我假设“向上”类似于解锁,“向下”类似于锁定;不过,这听起来像是一组用于信号量的方法。我还假设系统只有两个互斥锁(m 和 m1);因为标记对此并不完全清楚。

编辑:你提供的建议会变成这样:

shared: this.type = -1;
mutex m, m1=1;
count=0;

enter{
    down(m)
    if (this.type == process.type) up(m1)
    down(m1)
    this.type= process.type
    count++;
    up(m)
}
exit {
    count--;
    if(count==0) this.type = -1
    up(m1)
}

这仍然存在退出在状态修改时不是线程安全的问题;并且当一个新进程被唤醒/开始执行时,它的兄弟不会被唤醒。

我不完全确定在没有条件变量的情况下是否有一种安全的方法可以做到这一点;除非有关于可用问题的更多信息。(即这是在“监视器”的上下文中,其中方法执行已经是线程安全的)

于 2009-08-03T16:26:16.173 回答
0

我想想你说的话,确实我可以看到问题 - 10X!

添加一个计数器怎么样?当第一个相同类型的进程进入时 if counter==0 type==process.type(初始化类型)

在退出:计数器 - 如果(count==1)类型=-1,我会检查。

更好的??

于 2009-08-03T16:53:44.820 回答