Concurrency 静态互斥分析
有一种静态检查互斥正确性的语言明智吗?即Concurrency 静态互斥分析,concurrency,mutex,language-design,Concurrency,Mutex,Language Design,有一种静态检查互斥正确性的语言明智吗?即 var m var x guarded_by(m) func f1() { lock(m) x = 42 unlock(m) } func f2() { x = 42 // error, accessing x w/o holding its mutex } func f3() assumes_locked(m) { x = 42 } func b1() { f3() // error } func b2() {
var m
var x guarded_by(m)
func f1() {
lock(m)
x = 42
unlock(m)
}
func f2() {
x = 42 // error, accessing x w/o holding its mutex
}
func f3() assumes_locked(m) {
x = 42
}
func b1() {
f3() // error
}
func b2() {
lock(m)
f3()
unlock(m)
}
- 类可以通过锁参数化(称为
locks)李>ghost
- 字段可以通过指定必须保护它们的锁的注释进行保护;及
- 方法可以有
需要
注释,指定调用它们必须持有哪些锁
ghost
lock参数,这会变得稍微微妙一些;例如,你可以
类运行总计{
私有整数和=0,由m保护;
私有int乘积=1,由m保护;
公共void include(int x)需要m{
总和+=x;
乘积*=x;
}
public int getSum()需要m{
回报金额;
}
public int getProduct()需要m{
退货产品;
}
}
现在我可以将RunningTotals
对象嵌入到其他对象o
中,并使用o
的锁保护它,这很方便;但是,分析时需要注意哪个锁m
。另外,请注意,RunningTotals
中的方法无法在m
上同步,因为m
不在范围内,只是类型级别的ghost
;同步必须由客户端处理。与我们如何声明锁参数化类类似,RaceFreeJava的另一个特性是能够声明thread\u local
类;这些类永远不允许在线程之间共享,因此不需要用锁保护它们的字段
正如您在一篇评论中所指出的,判断一个程序使用这些注释是否正确通常是不可确定的,特别是因为Java允许您对任意表达式进行同步。为了理智起见,RaceFreeJava将同步限制在最终表达式上;然后,就像所有类似类型的注释一样,它对锁标识使用保守的语法检查。Abadi等人发现,大多数正确的程序都可以通过这种方式成功地进行检查。因此,他们以牺牲完整性为代价,强烈地依赖于可靠性(事实上,分析是声音模块化他们放入的一些逃生舱口)和可用性。为了检查可用性——这与完整性密切相关,因为过多的虚假警告使静态分析几乎不可用——Abadi等人还编写了一个工具(rccjava
),用于检查这些注释并进行少量注释推断,还用它构建了一个更大的工具(Houdini/rcc
)进行更多的推理。在评估这些(表I-IV)时,他们发现了真正的bug,没有太多必要的注释或虚假的警告。但是,请注意,它并不完美;本分析将抱怨一些有效的Java程序
其他静态种族检测器
因为我天生喜欢长篇大论,而且(正如我提到的)我写了关于这一点的本科论文,我还将讨论其他一些分析,但在我看来,RaceFreeJava可能是最相关的。如果你想直接跳到最后,这一节后面有一个总结
另一种基于系统的分析是由。这种类型的系统检测竞争条件和死锁,但使用不同的技术;它基于所有权类型,跟踪允许哪些线程访问哪些变量;只有在拥有变量所有者的锁时,才能访问变量。同样,方法可以注释所需的访问
或所需的锁
。为了检查死锁,Boyapati等人