Thread Safety Annotations 可以方便阅读代码,而且在编译的时候会检查锁的状态。
这里以GUARDED_BY为列,看它的定义
//art/runtime/base/macros.h
#if defined(__SUPPORT_TS_ANNOTATION__) || defined(__clang__) #define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) #else #define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op #endif #define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
必须定义了__SUPPORT_TS_ANNOTATION__或者__clang__ Thread Safety Annotations 才起作用,否则是no-op。我在Andriod的源码中没有找到这两个宏的定义,看来它们可能和编译器环境相关(clang是一种比较成熟的LLVM架构)。
变量带保护锁声明:
int suspend_count GUARDED_BY(Locks::thread_suspend_count_lock_);
表示suspend_count变量被thread_suspend_count_lock_保护
"GUARDED_BY(Locks::thread_suspend_count_lock_)" 这个表示在访问变量suspend_count 时会检查是否占有Locks::thread_suspend_count_lock_
再比如函数:
int GetSuspendCount() const EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_suspend_count_lock_) {
return tls32_.suspend_count;
}
"EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_suspend_count_lock_)"表示必须在调用该函数之前就已经获得该锁
这里给出一个实例:
class MyObject { public: Mutex Mu; int a GUARDED_BY(Mu); int *b PT_GUARDED_BY(Mu); }; void foo(MyObject &Obj) EXCLUSIVE_LOCKS_REQUIRED(Obj.Mu) { Obj.a = 0; // OK } void bar(MyObject &Obj) LOCKS_EXCLUDED(Obj.Mu) { Obj.lock(); Obj.a = 0; Obj.unlock(); } void test() { MyObject *obj = new MyObject(); obj->lock(); foo(*obj); obj->unlock(); bar(*obj); }
GUARDED_BY表示变量a被锁Mu保护
EXCLUSIVE_LOCKS_REQUIRED 表示foo函数被调用的时候,本线程已经占有Obj.Mu锁,否则会出错
LOCKS_EXCLUDED 表示bar函数被调用的时候,本线程没有占有Obj.Mu锁,否则会出错