可重复使用的屏障解决方案是否陷入僵局? [英] Reusable Barrier solution has a deadlock?

查看:129
本文介绍了可重复使用的屏障解决方案是否陷入僵局?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在读"信号量的小书",在第41页中有一个可重用屏障问题的解决方案。我的问题是,为什么它不会产生僵局。

1 # rendezvous
2
3 mutex.wait()
4     count += 1
5     if count == n:
6         turnstile2.wait() # lock the second
7         turnstile.signal() # unlock the first
8 mutex.signal()
9
10 turnstile.wait() # first turnstile
11 turnstile.signal()
12
13 # critical point
14
15 mutex.wait()
16     count -= 1
17     if count == 0:
18         turnstile.wait() # lock the first
19         turnstile2.signal() # unlock the second
20 mutex.signal()
21
22 turnstile2.wait() # second turnstile
23 turnstile2.signal()
在这个解决方案中,在第15行和第20行之间,在持有导致死锁的互斥锁的同时对信号量(在第18行)调用Wait()不是一种坏习惯吗?请解释一下。谢谢。

推荐答案

mutex保护count变量。第一个互斥锁负责递增计数器以说明每个线程,而进入的最后一个线程(if count == n)锁定第二个线程以准备离开(见下文),并释放正在等待的(n-1)个线程(在第10行上等待)。然后每一个信号都指向下一个。

第二个互斥锁的工作原理与第一个类似,但会递减count(相同的互斥文本保护它)。进入互斥锁的最后一个线程锁定turnstile以准备下一批处理(见上文),并释放在第22行等待的(n-1)个线程。然后每个线程向下一个线程发出信号。

这样turnstile将条目协调到临界点,而turnstile2则协调退出临界点。

可能没有死锁:当(最后一个)线程到达第18行时,turnstile被保证不会被任何其他线程占用(它们都在第22行等待)。类似于turnstile2

这篇关于可重复使用的屏障解决方案是否陷入僵局?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆