Thread Safety Annotations


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM