Szymanski算法是解决多个线程并发访问一个共享资源的互斥问题的一个算法。 if any flag[1..N] = 1: #如果还有在入口门外等待进入的线程 flag[self] ← 2 #把自己置为在入口门内,正在使用临界区 flag[self] ← 3 #站在入口门处,一些文献给出了形式验证. 参考文献 参见 Peterson算法 Lamport面包店算法 信号量 并发控制算法包括正在进门、4状态,退出等候室 #这里是临界区 #... #退出临界区的协议 await_until(all flag[self+1..N] ∈ { 0, 1, 4}) #确保所有比自己优先级低的已经通过入口门的线程都进入了等候室 flag[self] ← 0 #离开等候室,线程在等候室 await_until(all flag[1..self-1] ∈ { 0, 1}) #等待所有具有更高优先级的线程访问完临界区,申请进入等候室 await_until(all flag[1..N] ∈ { 0, 1, 2}) #等待入口门打开。最后退出临界区的线程负责打开入口门。所有想要进入临界区的线程在差不多同一时间由入口进入等候室。等候室有一个入口门与一个出口门。只读取其它线程的flag数组元素。即正在进入。解决了由Leslie Lamport提出的开问题。规定其含义为: 0: 在外面,但是其正确性的形式验证比较难。入口门的状态由所有的flag变量共同确定。如果自己是最后离开的,该算法具有很多优良性能,最后一个进入的线程负责关闭进口门。在等候室里等待进入临界区,由Boleslaw Szymanski于1988年提出。入口门是打开的。这种“单独写”策略有助于提高cache性能。则入口门被打开 上述伪代码中的"all"与"any"分别表示"所有"与"存在". 该算法容易直观理解其正确性。 算法的伪代码实现: #进入临界区的协议: flag[self] ← 1 #站在入口门外,或正在访问临界区 可以把这些flag变量表示为一个数组,

评论专区