一个简易读写锁

发点牢骚:csdn上实在找不到读并行写互斥的读写锁。。所以自己写了一个

class rw_mutex{

private:

    std::condition_variable __cond_v;

    std::atomic_int __r_threads;

    std::mutex __inner_lock;

    std::atomic_bool __w_thread;

public:

    rw_mutex():__r_threads(0),__w_thread(0){}

    void r_lock();

    void w_lock();

    void r_unlock();

    void w_unlock();

};

void rw_mutex::r_lock(){

    __r_threads.fetch_add(1,std::memory_order_acq_rel);

    std::mutex temp_mutex;

    std::unique_lock<std::mutex> ul(temp_mutex);

    __cond_v.wait(ul,[this]{return __w_thread.load(std::memory_order_acquire)==0;});

}

void rw_mutex::w_lock(){

    __inner_lock.lock();

    std::mutex temp_mutex;

    std::unique_lock<std::mutex> ul(temp_mutex);

    __cond_v.wait(ul,[this]{return __r_threads.load(std::memory_order_acquire)==0;});

    __w_thread.store(true,std::memory_order_release);

   

}

void rw_mutex::r_unlock(){

    __r_threads.fetch_add(-1,std::memory_order_acq_rel);

    __cond_v.notify_all();//防止通知错线程

}

void rw_mutex::w_unlock(){

    __w_thread.store(false,std::memory_order_release);

    std::atomic_thread_fence(std::memory_order_acq_rel);

    __cond_v.notify_all();

    __inner_lock.unlock();

}

主要有一下几点思路:

1、总体上:利用条件变量实现读写线程的互斥,利用互斥元实现写线程的互斥。读线程等待写线程结束;而写线程等待所有线程结束,以及等待获取写线程锁

2、细节上:读线程的条件变量等待的线程锁是空锁,保证读线程的并行;写线程等待的锁是类里的内置公共锁,保证写线程的互斥。利用原子操作保证指令顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值