与信号量的一般会合
General Rendezvous with Semaphores
我正在研究 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,signal 不仅会打开进程,它还会从信号量队列中删除 1 个进程,即使值为 -100。因此,您的第一个进程到达,它向障碍发出信号以转到 -n+2,然后等待将其放回 -n-1。下一个发出信号,释放第一个,然后使其再次发出信号。基本上,您的代码只会阻止前 n 个进程到达,直到下一个进程以 2 为一组到达,而不是直到所有 n 个都到达。
此外,只要您重置计数,正确的答案就允许重复,而如果相同的过程在第 2 轮返回,您的答案就会失败。
我正在研究 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,signal 不仅会打开进程,它还会从信号量队列中删除 1 个进程,即使值为 -100。因此,您的第一个进程到达,它向障碍发出信号以转到 -n+2,然后等待将其放回 -n-1。下一个发出信号,释放第一个,然后使其再次发出信号。基本上,您的代码只会阻止前 n 个进程到达,直到下一个进程以 2 为一组到达,而不是直到所有 n 个都到达。
此外,只要您重置计数,正确的答案就允许重复,而如果相同的过程在第 2 轮返回,您的答案就会失败。