加载中…
个人资料
南冠彤
南冠彤
  • 博客等级:
  • 博客积分:0
  • 博客访问:415,028
  • 关注人气:59
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

(转)使用boost条件变量实现写优先

(2012-10-30 09:47:45)
标签:

杂谈

分类: CPP/C
http://blog.sina.com.cn/s/blog_6bfde80a0100meay.html

测试发现,boost thread库实现的读写锁是读优先的(这一点我现在也不确定了,发现读写锁与运行平台关系太大了,windows 或linux,AMD还是intel,常常导致测试结果大相径庭)。所以当读线程多的时候,几乎无法获取写锁。大部分时候,写优先也许更符合应用的需求。 我参考网上代码,使用boost条件变量和临界区,实现了一个写优先的读写锁。优点是写优先,而且代码逻辑很清晰,缺点是……效率可能比较低。为什么说可 能而不是给出量化数据,是因为我发现不同的读写锁实现,效率与运行的平台关系太大了。代码如下:

#pragma once
#include

class read_write_mutex
  
public:
    read_write_mutex()
        : read_cnt(0)
        , write_cnt(0)
        , wait_write_cnt(0)
    {
    }
    ~read_write_mutex(){}

    void lock_read()
    {
        boost::mutex::scoped_lock lock(mutex);
        while (write_cnt > 0 || wait_write_cnt > 0)
        {
            allow_read_cond.wait(lock);
        }
        ++ read_cnt;
    }

    void unlock_read()
    {
        boost::mutex::scoped_lock lock(mutex);
        -- read_cnt;
        if (read_cnt == 0 && wait_write_cnt > 0)
        {
            allow_write_cond.notify_all();
             
    }

    void lock_write(){
        boost::mutex::scoped_lock lock(mutex);
        ++ wait_write_cnt;
        while(read_cnt != 0 || write_cnt != 0){
            allow_write_cond.wait(lock);
        }
        ++ write_cnt;
        -- wait_write_cnt;       
    }

    void unlock_write(){
        boost::mutex::scoped_lock lock(mutex);
        -- write_cnt;
        if (wait_write_cnt > 0)
        {
            allow_write_cond.notify_all();
        }
        else
        {
            allow_read_cond.notify_all();
         
    }

private:
    boost::mutex mutex;
    volatile int read_cnt;
    volatile int write_cnt;
    volatile int wait_write_cnt;
    boost::condition_variable allow_write_cond;
    boost::condition_variable allow_read_cond;

};

class scoped_rlock
{
public:
    scoped_rlock(read_write_mutex& mtx)
        :mutex(mtx)
    {
        mutex.lock_read();
    }
    ~scoped_rlock()
    {
        mutex.unlock_read();
    }
private:
    read_write_mutex& mutex;
};

class scoped_wlock
  
public:
    scoped_wlock(read_write_mutex& mtx)
        :mutex(mtx)
    {
        mutex.lock_write();
    }
    ~scoped_wlock()
    {
        mutex.unlock_write();
    }
private:
    read_write_mutex& mutex;
};

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有