在上一篇文章中提到了基于happens-before关系的FastTrack动态数据竞争检测方法,这篇文章中介绍的Loft方法是在FastTrack方法上进行了进一步地改进。
Reference :
http://www.cs.cityu.edu.hk/~wkchan/papers/issre2011-cai+chan.pdf
FastTrack方法中对每一个共享内存单元的写访问保留一个epoch形式的轻量级逻辑时钟,而同一个共享内存单元的并发读访问则会暂时保留向量时钟形式的逻辑时钟,在每次写访问之后,会清除读访问的向量时钟。因此整体上来看,对于读写访问的数据竞争检测复杂度为O(1)。但是对于同步操作中的同步对象,向量时钟相关的操作复杂度还是O(n)。
Loft提出了一些特殊的场景,能够最大化的减少同步对象上不必要的一些向量时钟。下图展示了一个很常见的消费者-生产者多线程程序,其中对于pool的访问通过锁保护。可以发现,由于加锁解锁操作在循环中,每迭代一次,m上的向量时钟都会被更新两次,但是假设其中某个线程一直以相同的状态自旋的话,那么m上向量时钟更新就是冗余的。
Loft中主要针对锁上的一些向量时钟更新,提出了6中如下图所示常见的场景。