我正在研究“信号量小书”一书中的可重用屏障算法(在此处存档)。
谜题在第 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 库Semaphore和Mutex函数实现了这一点。
更新:
谢谢starblue的回答。事实证明,如果由于某种原因线程之间的速度很慢,mutex.release()
并且在完整循环后semaphore.wait()
到达的任何线程semaphore.wait()
都将能够再次通过,因为将N
留下一个未使用的信号。
在对线程号 3 发出Sleep
命令后,我得到了这样的结果,其中可以看到线程 3 第一次错过了一个回合,线程 1 完成了 2 个回合,然后在第二个回合赶上了(实际上是它的第一回合)。
再次感谢大家的投入。