5

我正在研究“信号量小书”一书中的可重用屏障算法(在此处存档)。

谜题在第 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 库SemaphoreMutex函数实现了这一点。

更新:

谢谢starblue回答。事实证明,如果由于某种原因线程之间的速度很慢,mutex.release()并且在完整循环后semaphore.wait()到达的任何线程semaphore.wait()都将能够再次通过,因为将N留下一个未使用的信号。

在对线程号 3 发出Sleep命令后,我得到了这样的结果,其中可以看到线程 3 第一次错过了一个回合,线程 1 完成了 2 个回合,然后在第二个回合赶上了(实际上是它的第一回合)。

再次感谢大家的投入。

4

1 回答 1

4

一个线程可以通过屏障运行多次,而其他线程则根本不运行。

于 2011-02-19T09:23:43.527 回答