src/common/RWLock.h
RWLock使用了C++11新特性Deleted函數,禁用其拷貝構造函數與賦值操作符。
public:
RWLock(const RWLock& other) = delete;
const RWLock& operator=(const RWLock& other) = delete;
使用兩個原子變量對讀和寫鎖進行計數:
mutable atomic_t nrlock, nwlock;
為了防止寫進程被餓死,可使用PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP對讀寫鎖進行初始化:
#if defined(PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP)
if (prioritize_write) {
pthread_rwlockattr_t attr;
pthread_rwlockattr_init(&attr);
// PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
// Setting the lock kind to this avoids writer starvation as long as
// long as any read locking is not done in a recursive fashion.
pthread_rwlockattr_setkind_np(&attr,
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
pthread_rwlock_init(&L, &attr);
} else
#endif