博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost 读写锁
阅读量:4191 次
发布时间:2019-05-26

本文共 2394 字,大约阅读时间需要 7 分钟。

情景:

多线程编程中,通常某些数据是在多个线程间共享的,由于线程的并发行,一个线程读写的过程中另一个线程也极大可能同时读写, 这必然造成公共资源的错乱, 引起程序错误, 此时对公共资源的保护实在必行了, 需要使用公共资源之前, 先“锁”住, 防止其它线程更改,等待当前使用完成“解锁”后,其余线程才可以更改, 此种情形引出多种锁模型,适用于不同情形: 

1. 多线程争抢修改资源,都需要独占式修改 – 互斥独占式访问 
2. 多个线程只是读资源,并不修改 – 实际上不需要锁 
3. 某些线程修改,另一部分只是读取 – 写线程必须互斥独占式访问,读线程可共享式访问

实际上述情景3也可以全部独占互斥访问, 如果存在多个读取线程, 独占式需要逐个加锁、解锁访问,效率低下, 读写锁Write/Read lock 应运而生。

读写锁(Write/Read lock)

读写锁也叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的,当它以写模式锁住时,它是以独占模式锁住的。

那么读写锁如何实现呢? 在*nix 平台借助于pthread_rwlock_t 实现起来比较简单, 选用“准”标准库boost 中实现方式,代码如下:

//! A light read/write mutex that maps directly onto POSIX threading libraryclass light_rw_mutex{private:    pthread_rwlock_t m_Mutex;private:    light_rw_mutex(light_rw_mutex const&);                // Noncopyable    light_rw_mutex& operator= (light_rw_mutex const&);    // Noncopyablepublic:    light_rw_mutex()    {        pthread_rwlock_init(&m_Mutex, NULL);    }    ~light_rw_mutex()    {        pthread_rwlock_destroy(&m_Mutex);    }    void lock_shared()    {        pthread_rwlock_rdlock(&m_Mutex);    }    void unlock_shared()    {        pthread_rwlock_unlock(&m_Mutex);    }    void lock()    {         pthread_rwlock_wrlock(&m_Mutex);    }    void unlock()    {         pthread_rwlock_unlock(&m_Mutex);    }};

有了上述参照,自己封装读写锁却也不难。

class RLock{public:    RLock( light_rw_mutex & lock ) : mLock( lock )     {        mLock.lock_shared();    }    ~RLock()     {        mLock.unlock_shared();    }private:    light_rw_mutex &    mLock;     //注意这里是引用private:     // disable    RLock();    RLock(const RLock &);    const RLock & operator = (const RLock &);};class WLock{public:    WLock(light_rw_mutex & lock ) : mLock( lock )     {        mLock.lock();    }    ~WLock()     {        mLock.unlock();    }private:    light_rw_mutex &    mLock;     //注意这里是引用private:    // disable       WLock();    WLock(const WLock &);    const WLock & operator = (const WLock &);};

既然有“准”标准库boost, 也可以直接使用boost 已经实现的代码,简单方便:

//头文件#include 
#include
// 简单定义typedef boost::shared_mutex Lock; typedef boost::unique_lock< Lock > WriteLock;typedef boost::shared_lock< Lock > ReadLock;//使用exampleLock myLocker; // or light_rw_mutex myLocker;void ReadFunction(){ ReadLock rLock(myLocker); // or RLock rLock(myLocker); //Read common resource}void WriteFunction(){ WriteLock wLock(myLocker); // or WLock wLock(myLocker); //Write common resource}

转载地址:http://duloi.baihongyu.com/

你可能感兴趣的文章
《山河令》火爆,人人都想靠耽改剧赌一把
查看>>
让AI打工!搜狗全体员工于3月12日狗胜节放假一天
查看>>
干得漂亮!以后这些内容朋友圈都不能发了
查看>>
还在4S店买车?《Boss1+1》张朝阳对话贾鸣镝“种草”购车新方式
查看>>
蚂蚁集团CEO胡晓明宣布辞任
查看>>
怪兽充电递交IPO招股书:2020年净利润7540万元 阿里为第一大股东
查看>>
当《奇葩说》没了奇葩
查看>>
芯片短缺蔓延至手机市场:骁龙888短缺 三星中低端机型生产受阻
查看>>
用你的视频号“薅”微信流量,这个灰产太野了!
查看>>
苏宁易购回复深交所关注函:深国际和鲲鹏资本非一致行动人
查看>>
亿航智能⻓续航⻜机有望在4-8周内首⻜亮相
查看>>
微信:2021年1月至今封禁了1531个视频号帐号
查看>>
阿里系上市公司老板娘微博喊老公回家!多少创业鸟,已成纷飞燕?
查看>>
keep公众号就“借鉴”原创文章致歉:将停更一周
查看>>
新希望:拟参与设立总规模40亿元的广西新希望生猪保供专项产业基金
查看>>
瑞银:将京东目标价上调至110美元 维持“买入”评级
查看>>
刘作虎:今年一加9系列不会送测DxO
查看>>
柴犬为什么总是被卡住狗头?
查看>>
特斯拉回应海南碰撞事故:地面湿滑 车主踩制动踏板幅度较轻
查看>>
经济学家建议茅台国外售价为国内2倍:未来最有可能走向世界的奢侈品牌
查看>>