提问人:Miles DeBoer 提问时间:11/8/2023 更新时间:11/8/2023 访问量:18
我不明白旋转门是如何工作的
I don't get how turnstiles are able to work
问:
我正在阅读这本信号量小书,并达到了以下代码:
rendezvous
mutex . wait ()
count = count + 1
mutex . signal ()
if count == n: barrier . signal ()
barrier . wait ()// the part i don't get
barrier . signal ()
critical point
barrier 是 semaphore(0),mutex 是 semaphore(1)
书上说这个代码有效,但我不知道如何工作。如果 n-1 个线程到达 ,则障碍将等于 -(n-1) 并且对于最后一个线程,其中 count == n 表示障碍,但不会只使障碍 -(n-1)+1 对于大多数 n 值仍然是负的。 显然,这应该开始让线程一个接一个地过去, 但我很困惑。有人可以解释一下吗barrier.wait()
答:
0赞
John Bollinger
11/8/2023
#1
如果 n-1 个线程到达 ,则屏障将等于 -(n-1)
barrier.wait()
绝对不行。这是信号量的一个基本属性,你的书早在这一点之前就教过,信号量的值不能减少到 0 以下。当信号量的值已经为零时,尝试递减信号量的线程将阻塞,直到该值为正。
对于 count == n 的最后一个线程,它发出障碍信号,但不会只使障碍 -(n-1)+1 对于大多数 n 值仍然是负的
不。当最后一个线程通过时,它会将屏障信号量从 0 增加到 1。这将允许同一线程本身或已经阻塞的线程之一完成 .这会短暂地再次将信号量的值降低到 0,但每个到达该点的线程都会继续递增信号量,让另一个线程通过。barrier.wait()
barrier.wait()
barrier
上一个:在 C 语言中监控实现
下一个:SysV 信号量线程线程弹跳
评论
barrier.signal()
barrier.wait()