【问题标题】:In which state will this mutex coordinated threads end up?这个互斥体协调线程最终会处于哪种状态?
【发布时间】:2018-08-11 15:20:07
【问题描述】:

我有一个关于此设置会发生什么的理论问题。如果我有以下设置,这是死锁还是会发生什么?

我们在 fifo 队列中按顺序排列了三个进程 I、A 和 B。进程 I 初始化这些 Mutex 和变量并终止:

global int i = 1;
global mutex a = false;
global mutex b = true;

然后使用以下代码激活进程 A(队列中的下一个):

while(i < 4) {
    down(a)
    i = i / 2 + 2
    up(b)
}

因此循环将开始并且进程 A 将被锁定,因为互斥锁 a 不是免费的。因此它将从运行队列中移除并进入睡眠状态(并插入到 a 的队列中)。现在进程 B 使用以下代码激活:

while(i < 4) {
    down(b)
    i = i + 1
    up(a)
}

所以此时 b 没有被锁定,所以 B 进入,i 现在是 2。然后 B 解锁 a,它在我们的进程队列中排队进程 A,但 a 仍然被锁定为a 的队列在解锁之前不是空的? 如果是这样的话,B 会再次点击 down(b) 并锁定自己无法执行? b 会在自己的队列中记住 B 并让 B 进入睡眠状态。但是现在A当然可以再次执行,但会在a仍被锁定时命中down(a)?因此两个进程都超出了进程队列而不再运行?

这有点像我从我们的信息学讲座中了解到的,但这是真的吗?这些进程必须等待外部进程最终解锁权限?

【问题讨论】:

    标签: mutex semaphore


    【解决方案1】:

    然后 B 解锁 a,它在我们的进程队列中加入进程 A,但 a 仍然被锁定

    你先说对了——B解锁a,所以a处于解锁状态。 A 可以锁定它并继续执行。

    得到的序列是:

    • A 尝试锁定 a 并休眠。
    • B 锁定 b 并将 i 从 1 增加到 2。
    • B 解锁a,唤醒A
    • B 锁定 b 并休眠。
    • A 执行 i = i / 2 + 1i 变为 3)并解锁 b,唤醒 B
    • A 锁定 a 并休眠。
    • Bi 从 3 增加到 4。
    • B 解锁 a,唤醒 A 并退出。
    • A 执行i = i / 2 + 1i 仍为 4)并解锁 b(不影响 B,因为它已退出)并退出。

    您所说的互斥量通常称为“信号量”或“二进制信号量”。术语“互斥量”通常用于二进制信号量的受限版本:始终在解锁状态下创建,只能由锁定它的同一线程解锁。

    【讨论】:

    • 哦,我明白了,A 已经在 down(a) 指令后面重新唤醒,对吧?在我看来,无论出于什么原因,我都会再次开始执行整个指令,这是我的想法的错误。非常感谢您的澄清。
    • A 首先睡在down(a) 中,一旦aup(a) 中被B 解锁,就会被唤醒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多