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