形式陈述 ​
经典 并发分离逻辑 可在资源上下文中声明 with r when B do C,核心规则是
进入临界区时,线程从空闲资源
原始 O’Hearn–Brookes 体系要求资源不变式是 precise:对任意总堆,至多有一个子堆满足
形式上,若
直觉
资源不变式不是“每条机器指令后都公开成立”的普通断言。锁空闲时,资源和不变式一起由锁保管;线程取得锁后可以暂时拆开不变式、更新内部状态,只要释放前恢复。其他线程在此期间无法取得同一资源,所以看不到这段逻辑上的开放窗口。
条件临界区中的 guard
这是一笔借还账:acquire 把共享堆片段转到线程局部上下文,release 要求原数归还满足新状态的片段。若线程把资源留在自己的后置中又同时关闭 invariant,就等于复制所有权;若只归还一部分,下一个取得者便拿不到声明的资源。
例子与边界
令锁
线程取得 [x]:=n+1,随后以见证
但仅凭
若线程释放锁时仍在局部后置中保留
推论与应用
资源不变式把共享数据结构的表示条件封装在锁规格中。客户端不必永久携带整棵共享树或队列,只在持锁区域内取得表示资源;退出时恢复结构不变式。多把锁可各自保护不相交资源,减少一个巨大全局不变式带来的证明耦合。
同一开闭思想也出现在信号量、监视器和现代原子协议中,但同步对象必须说明何时转移资源、失败的 acquire 是否取得任何份额、异常退出怎样归还。资源不变式主要支持安全和局部推理;锁最终可得、临界区有界等待和死锁自由仍需进展或锁序证明。
多资源程序还要规定嵌套取得次序。每个局部 invariant 都可能被正确恢复,线程仍可能以相反顺序取得两把锁而死锁;反之,为避免死锁建立全局锁序,并不会自动证明每份堆资源在 release 时已归还。资源安全与进展条件应在接口中分别列出。
参考资料
- Peter W. O’Hearn, “Resources, Concurrency and Local Reasoning,” Theoretical Computer Science 375(1–3), 2007, pp. 271–307。
- Stephen Brookes, “A Semantics for Concurrent Separation Logic,” Theoretical Computer Science 375(1–3), 2007, pp. 227–270。
- Peter W. O’Hearn, “Separation Logic,” Communications of the ACM 62(2), 2019, pp. 86–95。