Tips 线程安全注解(thread safety annotations)

thread annotations 之 GUARDED_BY

leveldb 中 thread_annotations.h 有如下宏定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#if defined(__clang__)

#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
#else
#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
#endif

#endif // !defined(THREAD_ANNOTATION_ATTRIBUTE__)

#ifndef GUARDED_BY
#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
#endif

#ifndef PT_GUARDED_BY
#define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
#endif

no-op macro

其中有用到 no-op macro,一般有几种声明方式

1
2
3
#define do_nothing(x)
#define do_nothing(x) (void)0
#define do_nothing(x) do {} while(0)

线程安全注解(thread safety annotations)

线程安全注解(thread safety annotations) 是 clang 提供的用于编译期检查锁的使用的一系列宏。其功能为编译时检查锁的使用,提示编译警告或错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
类拥有加锁解锁的成员函数
LOCKABLE
类对锁的使用遵循 RAII
SCOPED_LOCKABLE
函数进入时确保未加锁,函数退出时已加锁
EXCLUSIVE_LOCK_FUNCTION
SHARED_LOCK_FUNCTION
尝试加锁并返回成功与否
EXCLUSIVE_TRYLOCK_FUNCTION, SHARED_TRYLOCK_FUNCTION
函数进入时确保已加锁,退出时已释放
UNLOCK_FUNCTION
数据被访问时确保已加锁
GUARDED_BY, PT_GUARDED_BY
函数被调用时确保已经加锁
EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED
函数被调用时确保未加锁
LOCKS_EXCLUDED
死锁监测,确保锁的加锁顺序
ACQUIRED_BEFORE, ACQUIRED_AFTER

链接中有不少实例,C++ 网络库 muduo 也几乎全面添加了线程安全注解

链接

Thread Safety Analysis — Clang 3.5 documentation
Hutchins_ThreadSafety.pdf