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鎖,否則會出錯