线程模块化抽象解释中的不同读取分析方法
在并发编程的分析中,为了确保程序的正确性和高效性,需要对线程间共享的全局变量的读写操作进行精确分析。下面将介绍几种不同的读取分析方法,包括基于保护的读取、以锁为中心的读取和以写为中心的读取,并分析它们的特点和正确性。
1. 基于保护的读取(Protection-Based Reading)
基于保护的读取分析方法相对于跟踪语义是可靠的。在分析过程中,不会从局部状态的变量赋值中移除任何值。为了保持局部状态表示的简洁性,还可以额外跟踪每个程序点和当前持有的锁集下,可能已被写入但尚未发布的全局变量集合 $W$。当全局变量 $g$ 不在 $P \cup W$ 中时,可以安全地从 $\sigma$ 中移除 $g$ 的本地副本。
该分析需要预先给定映射 $M: G \to 2^M$,不过也可以动态推断 $M$。将 $M[g]$ 视为约束系统的独立未知量,其取值在完全格 $2^M$ 中,并初始化为所有互斥锁的集合 $M$。对全局变量 $g$ 进行写入操作时,右侧函数会将当前锁集作为对 $M[g]$ 的贡献。
然而,控制流边的解锁操作在未知量 $M[g]$ 上不再单调。为了提高效率,还可以放弃根据持有的锁集进行状态分割,但会损失一定的精度。具体做法是,额外跟踪每个程序点必须持有的互斥锁集合 $\overline{S}$,并在所有右侧函数中用 $\overline{S}$ 替换 $S$。
2. 以锁为中心的读取(Lock-Centered Reading)
以锁为中心的读取方法是对 Miné 分析的改进,去除了线程 ID 和实时系统特定的特性,并通过副作用约束系统进行重新表述。该方法为每个程序点
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



