我正在研究“信号量小书”一书中的可重用障碍算法,可在此处http://greenteapress.com/semaphores/downey08semaphores.pdf
这个谜题在第31页(基本同步模式/可重复使用的障碍)上,我提出了一个“解决方案”(或不是),它与本书的解决方案(两阶段障碍)不同。
这是每个帖子的'代码':
# n = 4; threads running
# semaphore = n max., initialized to 0
# mutex, unowned.
start:
mutex.wait()
counter = counter + 1
if counter = n:
semaphore.signal(4) # add 4 at once
counter = 0
mutex.release()
semaphore.wait()
# critical section
semaphore.release()
goto start
这似乎有效,我甚至将不同的睡眠定时器插入到线程的不同部分,并且在继续每个循环之前它们仍然等待所有线程。我错过了什么吗?是否存在失败的情况?
我使用Windows库信号量和互斥函数实现了这个。
更新
感谢 starblue 的回答。事实证明,如果由于某种原因线程在mutex.release()
和semaphore.wait()
之间变慢,那么在完整循环之后到达semaphore.wait()
的任何线程都将能够再次通过,因为将会是剩下的N个未使用信号之一。
在为3号线设置Sleep命令后,我得到了这个结果http://pastebin.com/raw.php?i=FfXcCMZ3,其中第一次可以看到线程3错过了一个转弯,线程1完成了2次转弯,然后赶上了第二回合(实际上是第一回合)。
再次感谢大家的意见。
答案 0 :(得分:3)
一个线程可以通过屏障运行几次,而其他一些线程根本不运行。