【发布时间】:2011-06-30 06:36:47
【问题描述】:
我正在研究“信号量小书”一书中的可重用屏障算法(存档here)。
谜题在第 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 提供answer。事实证明,如果由于某种原因线程在mutex.release() 和semaphore.wait() 之间变慢,则在完整循环后到达semaphore.wait() 的任何线程都将能够再次通过,因为将有一个@987654332 @ 未使用的信号。
并为线程号 3 设置了Sleep 命令,我得到了this 结果,其中可以看到线程 3 第一次错过了一圈,而线程 1 已经完成了 2 圈,然后赶上了第二回合(实际上是第一回合)。
再次感谢大家的意见。
【问题讨论】:
标签: multithreading algorithm concurrency mutex barrier