读写锁CSpinRwLock

2020-04-10  本文已影响0人  星夜兼程工作笔记

写者模型与生产者消费者模型大致一样,也满足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();}

};

};

上一篇下一篇

猜你喜欢

热点阅读