读写锁CSpinRwLock
写者模型与生产者消费者模型大致一样,也满足3,2,1规则。
3种关系:读者与读者(没有关系),写者与写者(竞争关系),读者与写着(互斥与同步关系)
他们之间最大的区别是消费者会”取走”数据,而读者不会“取走‘数据。一般情况下,读者远远多于写者,所以,一般情况下,写者较读者优先权更高。
有种情况是非常常见的,就是对于公共数据修改的机会比较少,相比较改写,他们读的机会反而更多。读写锁本质是一种自旋锁。
class CSpinRwLock:no_copy
{
pthread_rwlock_t rwl;
public:
CSpinRwLock() { pthread_rwlock_init(&rwl,NULL);}
~CSpinRwLock() {pthread_rwlock_destroy(&rwl);}
void rLock() {pthread_rwlock_rdlock(&rwl);}
void rUnLock() {pthread_rwlock_unlock(&rwl);}
bool rtryLock(){return pthread_rwlock_tryrdlock(&rwl);}
bool wtryLock(){return pthread_rwlock_trywrlock(&rwl);}
void wLock() {pthread_rwlock_wrlock(&rwl);}
void wUnLock() {pthread_rwlock_unlock(&rwl);}
class scoped_rlock:no_copy
{
CSpinRwLock &ftx;
void operator=(const scoped_rlock&)(){}
public:
scoped_rlock(CSpinRwLock & ft) : ftx(ft) { ftx.rLock();}
~scoped_rlock() { ftx.rUnlock();}
};
class scoped_wlock:no_copy
{
CSpinRwLock &ftx;
void operator=(const scoped_wlock&)(){}
public:
scoped_wlock(CSpinRwLock & ft) : ftx(ft) { ftx.wLock();}
~scoped_wlock() { ftx.wUnlock();}
};
};