“第二阶段检查 干扰自由。对线程 $i$ 的每个纲要断言 $A$,以及线程 $j\ne i$ 的每个原子动作 $a$,都证明”
形式陈述 ​
给定状态谓词
在 Owicki–Gries 风格的并发证明中,每个线程都有带控制点断言的顺序证明纲要。设
这里的 Hoare 三元组 不是只检查动作自己的后置,而是在动作实际可能启用的状态中检查另一线程事实是否幸存。若
直觉
顺序证明默认“我刚建立的事实在下一行之前不会被别人改掉”。共享内存把这个默认撕开:本线程停在两个指令之间时,其他线程可以任意走许多步。干扰自由逐一审查这些外来步,确认它们不会推翻当前控制点依赖的断言。
它比“两个线程不写同一变量”更精确。变量不相交当然足以消除许多干扰,但两个动作也可以共同修改计数器并仍然保持“计数器非负”;反过来,一个线程只改变量
例子与边界
令断言
环境动作 y := y + 1。从
有效。动作 x := x + 1 时则不稳定:状态
恢复有效。这个例子也说明动作的控制前断言不是装饰条件,它可以精确排除伪干扰。
边界在原子粒度。若 if x<y then x:=x+1 的测试和写入是两个可交错步骤,另一线程可能在二者之间减小
断言也必须覆盖所有会被后续局部证明使用的控制点,而不只是线程入口与出口。某个外来动作可能保持最终目标,却破坏本线程下一条赋值所需的中间前置;等本线程继续执行时错误才显现。proof outline 的细粒度正是为了在这个暂停位置捕获干扰。
推论与应用
干扰自由把若干顺序 proof outline 连接成并发安全证明,是 Owicki–Gries 方法 的全局检查阶段。依赖—保证推理把外来动作概括为 rely 关系,再以另一组件的 guarantee 兑现;并发分离逻辑则用所有权排除大批根本无法访问本地资源的动作。三者处理的是同一类稳定性问题,却采用不同的模块边界。
实际验证器可以把每个 action/assertion 对编码成验证条件。数量可能随线程和控制点成平方增长,因此减少原子动作、寻找共享归纳不变式或使用更组合化的规格会影响可扩展性。不过合并动作必须尊重真实抢占边界;为了少几个公式而虚构原子块,会改变被证明的程序。
稳定性具有逐步归纳用途:若
参考资料
- Susan Owicki and David Gries, “An Axiomatic Proof Technique for Parallel Programs I,” Acta Informatica 6, 1976, pp. 319–340。
- Susan Owicki and David Gries, “Verifying Properties of Parallel Programs: An Axiomatic Approach,” Communications of the ACM 19(5), 1976, pp. 279–285。
- Krzysztof R. Apt, Frank S. de Boer, and Ernst-Rüdiger Olderog, Verification of Sequential and Concurrent Programs, 3rd ed., Springer, 2009, Chs. 8–10。