在阅读leveldb源码的过程中,发现很多成员变量被GUARDED_BY修饰,如下:

struct IterState {port::Mutex* const mu;Version* const version GUARDED_BY(mu);MemTable* const mem GUARDED_BY(mu);MemTable* const imm GUARDED_BY(mu);IterState(port::Mutex* mutex, MemTable* mem, MemTable* imm, Version* version): mu(mutex), version(version), mem(mem), imm(imm) {}
};

宏定义如下:

#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
#else
#define THREAD_ANNOTATION_ATTRIBUTE__(x)  // no-op
#endif#endif  // !defined(THREAD_ANNOTATION_ATTRIBUTE__)#ifndef GUARDED_BY
#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
#endif#ifndef PT_GUARDED_BY
#define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
#endif

通过翻阅资料,发现这是c++静态检测对应的变量是否有对应的mutex保护的方法。

只要在代码中通过代码注解(annotations )告诉编译器哪些成员变量和成员函数是受哪个 mutex 保护,这样如果忘记了加锁,编译器会给警告。因为在后续维护别人的代码时候,往往不像原作者那样深刻理解设计意图,特别容易遗漏线程安全的假设

使用方法也很简单,我们可以通过clang增加编译参数-Wthread-safety -Werror,获取有关线程安全的warning。

而leveldb使用的是abseil-cpp版本,使用方法相同

参考链接

  1. Thread Safety Analysis
  2. 现代 C++ 开发(1):线程安全注解
  3. C/C++ Thread Safety Analysis
  4. thread_annotations.h
  5. Enable thread safety annotations in open source version.

c++的线程安全静态检查相关推荐

  1. 代码静态检查之findbugs

    白盒测试中的静态检查一般是检查编码标准规范,错误列表.编码规范往往团队会根据自己的经验和风格进行设置一些规范.现在很多IDE工具都会在编辑代码的时候实时的提醒是否符合代码风格.错误列表,一般是代码潜在 ...

  2. React——Flow代码静态检查

    为什么80%的码农都做不了架构师?>>>    Flow Flow是Facebook开源的静态代码检查工具,他的作用是在运行代码之前对React组件以及Jsx语法进行静态代码的检查以 ...

  3. linux shell脚本 静态检查工具 shellcheck 简介

    简介 shellcheck 是一款实用的 shell脚本静态检查工具. 首先,可以帮助你提前发现并修复简单的语法错误,节约时间.每次都需要运行才发现写错了一个小地方,确实非常浪费时间. 其次,可以针对 ...

  4. linux sparse 内核代码静态检查

    Sparse简介 Sparse诞生于2004年,是由Linux之父开发的,目的就是提供一个静态检查代码的工具,从而减少Linux内核的隐患.起始,在Sparse之前已经有了一个不错的代码静态检查工具( ...

  5. RTT 动态线程和静态线程

    TIPS:动态线程和静态线程 RT-Thread中支持静态和动态两种定义方式.用线程来举例的话,rt_thread_init对应静态定义方式,rt_thread_create对应动态定义方式. 使用静 ...

  6. Jenkins 在 Tomcat 中的部署及代码静态检查工具集成

    Jenkins 的简单部署 在安装了 Jenkins 运行所需的依赖(主要是 JDK)之后,可以通过如下步骤简单快速地部署 Jenkins: 下载 Jenkins. 打开终端并切换至下载目录. 运行命 ...

  7. java 静态线程_Java线程类静态本机void yield()方法(带示例)

    线程类静态本机无效 yield()软件包java.lang.Thread.yield()中提供了此方法. yield()方法表示停止当前正在执行的线程,并为其他优先级相同的等待线程提供机会. 如果没有 ...

  8. React Native工程中TSLint静态检查工具的探索之路

    背景 建立的代码规范没人遵守,项目中遍地风格迥异的代码,你会不会抓狂? 通过测试用例的程序还会出现Bug,而原因仅仅是自己犯下的低级错误,你会不会抓狂? 某种代码写法存在问题导致崩溃时,只能全工程检查 ...

  9. 代码静态检查工具PC-Lint运用实践

    代码静态检查工具PC-Lint运用实践 如何提交zero bug的产品,如何尽早发现bug,是软件开发工程师和测试工程师都需要思考的问题.我认为高质量的代码是关键,具体实施保障办法有:框架约束,代码评 ...

最新文章

  1. php将数组最后一个单元弹出,php array_pop()数组函数将数组最后一个单元弹出(出栈)...
  2. hana sql mysql oracle,从oracle dba的角度看HANA数据库
  3. 用GDB调试程序(四)
  4. 计算机系统最大的加速能力,系统加速我用Windows系统四大自带工具 -电脑资料
  5. chrome js 读取文件夹_使用JavaScript遍历本地文件夹的文件
  6. 为什么说dubbo的声明式缓存不好用!!!
  7. python解zuobiaoxi方程_吴恩达《Machine Learning》精炼笔记 2:梯度下降与正规方程
  8. 使用 jQuery Mobile 与 HTML5 开发 Web App (十) —— jQuery Mobile 默认配置与事件基础
  9. 页面回填当前日期与时间
  10. ArrayList概述
  11. openstackdvr模式
  12. arcgis海岸带_需科学划定海岸带基准地理边界
  13. java.lang.IllegalArgumentException: Failed to decrypt问题解决
  14. 如何接入易班第三方登录
  15. 谷歌浏览器 如何设置在新标签页打开链接
  16. Chrome 地址栏 Google 搜索错误处理 隐私设置错误 您的连接不是私密连接
  17. python发邮件图片太长显示不出来_小白入门,用python 发送定时邮件,将Dataframe转为邮件正文,链接显示为图片...
  18. C语言有大约40个运算符,最常用的有这些
  19. Vue.js watch 属性
  20. “使用达芬奇软件实现Autosar架构:配置和注意事项“

热门文章

  1. 数据分析与挖掘实战-窃电漏电用户的发现
  2. 结合html做界面_Spark UI界面实现原理
  3. 数塔问题和最长上升子序列问题
  4. 最长上升子序列(LIS)的求法
  5. qss样式表笔记大全(一):qss名词解析(包含相关示例)
  6. ARP欺骗与嗅探入侵揭密--上篇(转)
  7. 数据结构与算法 | 直接插入排序、希尔排序
  8. TLS1.3握手流程以及参数详解
  9. 从零开始玩转JMX(二)——Condition
  10. Python中的协程