我不明白旋转门是如何工作的

I don't get how turnstiles are able to work

提问人:Miles DeBoer 提问时间:11/8/2023 更新时间:11/8/2023 访问量:18

问:

我正在阅读这本信号量小书,并达到了以下代码:

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赞 Matt Timmermans 11/8/2023
之后让下一个线程通过,然后让下一个线程通过,依此类推。barrier.signal()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