C++_GUARDED_BY 和EXCLUDES属性字

在梳理ADB源码的时候,看到代码中函数中有大写的GUARDED_BY和EXCLUDES等字眼。一开始猜想可能是宏定的什么变量吧。但是一番检索后并没有发现有哪里定义,并且我之前都没有接触过这样的额用法。
/system/core/adb/adb_listeners.cpp

...
static ListenerList& listener_list GUARDED_BY(listener_list_mutex) = *new ListenerList();
...
static void listener_disconnect(void* arg, atransport*) EXCLUDES(listener_list_mutex) {
...
}

经过查找,后来发现这些都是在Clang Thread Safety Analysis(线程安全分析)中定义的属性,Clang Thread Safety Analysis是C ++语言扩展,它警告代码中潜在的竞争条件。分析是完全静态的(即编译时);没有运行时开销。该分析仍在积极开发中,但已经足够成熟,可以在工业环境中进行部署。它是由Google与CERT / SEI合作开发的,并广泛用于Google的内部代码库中。

GUARDED_BY

GUARDED_BY是数据成员的属性,该属性声明数据成员受给定功能保护。对数据的读操作需要共享访问,而写操作则需要互斥访问。
该 GUARDED_BY属性声明线程必须先锁定listener_list_mutex才能对其进行读写listener_list,从而确保增量和减量操作是原子的

EXCLUDES

EXCLUDES是函数或方法的属性,该属性声明调用方不拥有给定的功能。该注释用于防止死锁。许多互斥量实现都不是可重入的,因此,如果函数第二次获取互斥量,则可能发生死锁。
在上面代码中的EXCLUDES表示的意思是:调用listener_disconnect()函数的调用用不能拥有listener_list_mutex锁。

当然,还有其他的属性,已经有官方文档,我就不多赘述,有需要的请访问CLANG的文档-线程安全分析

参考:http://clang.llvm.org/docs/ThreadSafetyAnalysis.html

发布了41 篇原创文章 · 获赞 35 · 访问量 4295

猜你喜欢

转载自blog.csdn.net/weixin_38140931/article/details/103958906