gpt4 book ai didi

deadlock - 可重复使用的Barrier解决方案陷入僵局?

转载 作者:行者123 更新时间:2023-12-02 21:46:54 29 4
gpt4 key购买 nike

我一直在读《The Little Book of Semaphores》,第 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)锁定第二个 tunstile 以准备离开(见下文)并释放正在等待的 (n-1) 个线程(在第 10 行等待)。然后每个信号都向下一个发出信号。

第二个互斥锁的工作方式与第一个类似,但会减少 count(相同的互斥锁对其进行保护)。最后一个进入互斥锁 block 的线程会锁定 turnstile 为下一批进入做准备(见上文),并释放在第 22 行等待的 (n-1) 个线程。然后每个线程向下一个线程发出信号。

因此,turnstile 协调进入临界点的入口,而 turnstile2 协调从临界点的导出。

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

类似

关于deadlock - 可重复使用的Barrier解决方案陷入僵局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168874/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com