前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Lockset和Happens-before的数据竞争方法汇总

基于Lockset和Happens-before的数据竞争方法汇总

原创
作者头像
chain
发布2018-06-05 13:22:36
8750
发布2018-06-05 13:22:36
举报

之前的文章介绍都是单独使用lockset或是单独使用happens-before关系进行动态数据竞争检测的方法。单纯使用lockset算法,由于不考虑其他的一些同步原语,会导致很多的误报,但是该方法对线程交错不太敏感。单纯使用happens-before关系,该方法对线程交错比较敏感,因此会导致出现很多漏报。因此结合lockset算法和happens-before关系的混合(hybrid)算法由此而生。

Hybrid混合算法的思想主要有两种:

  • 首先利用happens-before关系找到所有潜在的并发的访问,然后利用lockset算法验证这些并发访问是否受到公共的锁集保护。
  • 首先利用lockset算法找到不受公共锁保护的潜在的并发访问,然后利用happens-before关系推导哪些访问之间没有确定性先后关系。

这篇文章中主要介绍的是第一种混合算法,主要相关的方法包括如下:

Helgind+

Helgrind+中提出了一种线程段(thread segment)用来分割一个线程的执行序列。通过线程段来进行happens-before关系的推导。同时结合lockset算法中的共享内存状态机在某些状态下判断是否构成数据竞争。该方法中每个共享内存单元只只能够保留最近的一个线程段,并且该方法中涉及到大量的状态 切换。

Helgrind+
Helgrind+

ThreadSanitizer

ThreadSanitizer中同样也是使用线程段这个概念来分割一个线程的执行序列。和Hengrind+不同的是,该方法通过分析happens-before关系来保存所所有潜在的并发写segment集合,以及保存所有潜在的并发读segment集合并且在任意写segment之后发生。然后通过锁集算法验证是否并发的两个segment有公共的锁集保护其中至少一个是写segment。

ThreadSanitizer
ThreadSanitizer

Acculock

Acculock中使用FastTrack中提到的基于epoch的轻量级逻辑时钟来进行happens-before分析,同时对解锁操作增加时间戳,根据锁集的时间戳来去掉一些冗余的分析。由于该方法中使用保留的都是共享内存最后一次的读和写相关的epoch和锁集,因此混存在一定的误报和漏报。

Acculock
Acculock

MultiLock-HB

MultiLock-HB方法是在Acculock方法上的改进,主要针对Acculock中固有的缺陷,因此采用类似ThreadSanitizer中保留一定长度的完整的历史读写访问信息,包括锁集和epoch,同时根据锁集的集合的包含关系,去掉一些冗余的分析。

这里写图片描述
这里写图片描述

SimpleLock

SimpleLock方法使用的假设是程序中一般不会发生使用两个不同锁的情况,一般都是由于没有加锁或是少加锁。因此该方法中不需要使用锁集来进行分析,而是直接统计共享内存有多少个锁保护。

SimpleLock+

SimpleLock+方法在SimpleLock的基础上,继续精简,使用布尔变量来表示共享内存访问是否有锁保护。

到此为止的话,基本的动态数据竞争检测相关的方法都已经介绍完毕,想要详细了解的同学可以参考这些论文。

后序将介绍对之前介绍的动态数据竞争检测方法进行的实验测评

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Helgind+
  • ThreadSanitizer
  • Acculock
  • MultiLock-HB
  • SimpleLock
  • SimpleLock+
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档