可重用障碍算法

时间:2011-02-19 06:34:53

标签: multithreading algorithm concurrency barrier

我正在研究“信号量小书”一书中的可重用障碍算法,可在此处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次转弯,然后赶上了第二回合(实际上是第一回合)。

再次感谢大家的意见。

1 个答案:

答案 0 :(得分:3)

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