我正在通过The Little Book of Semaphores来实现会合障碍。以下代码是否会成为障碍?

如果我们具有以下变量:

n = the number of threads
barrier = Semaphore(-n + 1)

然后,我们在以下代码上执行n线程。
# Rendezvous
barrier.signal()
barrier.wait()
barrier.signal()

# critical point

预订答案

这是作者的变量。
n = the number of threads
count = 0
mutex = Semaphore(1)
barrier = Semaphore(0)

作者的障碍解决方案
mutex.wait()
count = count + 1
mutex.signal()

if count == n: barrier.signal()

barrier.wait()
barrier.signal()

# critical point

我了解作者的解决方案,我想知道我的方法是否可行。

最佳答案

解决方案的问题是,如果值变为1,信号不仅会打开进程,即使值是-100,也会从信号量队列中删除1个进程。因此,您的第一个进程到了,它表示进入-n + 2的障碍,然后等待将其放回-n-1。下一个出现并发出信号,释放第一个,然后再次发出信号。基本上,您的代码只会停止前n个进程的到达,直到下一个进程(以2为一组)到达,直到所有n个进程都到达为止。

此外,只要您重置计数,正确的答案就可以重复,而如果第二轮返回相同的过程,您的答案就会失败。

09-26 00:15