关于linux锁的c++封装 条件锁,读写锁(不同方式实现读写优先)
2015-06-08 11:27
851 查看
封装linux的pthread_mutex_t作为普通锁,pthread_cond_t和pthread_mutex_t一起作为条件锁,能够等待和发送唤醒信号。最后结合二者分别实现了读写锁。两个普通的锁组合成写优先的读写锁,一个条件锁封装为读优先的锁
</pre><pre name="code" class="cpp">// // Created by ma on 2015/5/29. // #ifndef LOCK_H_ #define LOCK_H_ #include <unistd.h> //normal lock class Lock { public: Lock(); virtual ~Lock(); void lock(); void unlock(); protected: pthread_mutex_t mutex_t; }; //lock with condition class Condition_Lock:public Lock{ public: Condition_Lock(); virtual ~Condition_Lock(); int wait(); int wait_time(int sec); //wait seconds void signal(); void broadcast(); private: pthread_cond_t cond; }; //read-write lock with reading first class RW_Lock{ public: RW_Lock(); ~RW_Lock(); void rd_lock(); void rd_unlock(); void wt_lock(); void wt_unlock(); private: int m_stat; Condition_Lock c_lock; }; //read-write lock with writing first class RW_Lock_w { public: RW_Lock_w(); void rd_lock(); void rd_unlock(); void wt_lock(); void wt_unlock(); private: int rd_cnt; Lock r_lock; Lock w_lock; }; #endif //LOCK_H_
// // Created by ma on 2015/5/29. // #include <pthread.h> #include <sys/time.h> #include "Lock.h" Lock::Lock() { pthread_mutex_init(&mutex_t,NULL); } void Lock::lock() { pthread_mutex_lock(&mutex_t); } void Lock::unlock() { pthread_mutex_unlock(&mutex_t); } Lock::~Lock() { pthread_mutex_destroy(&mutex_t); } //--------------------------------------------------- int Condition_Lock::wait() { return pthread_cond_wait(&cond,&mutex_t); } Condition_Lock::Condition_Lock():Lock() { pthread_cond_init(&cond,NULL); } Condition_Lock::~Condition_Lock() { pthread_cond_destroy(&cond); } void Condition_Lock::broadcast() { pthread_cond_broadcast(&cond); } void Condition_Lock::signal() { pthread_cond_signal(&cond); } int Condition_Lock::wait_time(int sec) { struct timespec tp; struct timeval tv; gettimeofday(&tv,NULL); tp.tv_sec=tv.tv_sec+sec; tp.tv_nsec=tv.tv_usec*1000; return pthread_cond_timedwait(&cond,&mutex_t,&tp); } //----------------------------------------------- RW_Lock::RW_Lock():m_stat(0){ } RW_Lock::~RW_Lock() { } void RW_Lock::rd_lock() { c_lock.lock(); while(m_stat<0) c_lock.wait(); m_stat++; c_lock.unlock(); } void RW_Lock::rd_unlock() { c_lock.lock(); m_stat--; c_lock.signal(); c_lock.unlock(); } void RW_Lock::wt_lock() { c_lock.lock(); while(m_stat>0) c_lock.wait(); m_stat=-1; } void RW_Lock::wt_unlock() { m_stat= 0; c_lock.broadcast(); c_lock.unlock(); } //------------------------------------- RW_Lock_w::RW_Lock_w() { } void RW_Lock_w::rd_lock() { r_lock.lock(); if(++rd_cnt==1) w_lock.lock(); r_lock.unlock(); } void RW_Lock_w::rd_unlock() { r_lock.lock(); if(--rd_cnt==0) w_lock.unlock(); r_lock.unlock(); } void RW_Lock_w::wt_lock() { w_lock.lock(); } void RW_Lock_w::wt_unlock() { w_lock.unlock(); }
相关文章推荐
- 简单文件传输TFTP服务器搭建 Linux RHEL6
- linux下lvs搭建负载均衡集群
- linux下lvs搭建负载均衡集群
- Linux下配置ssh无密码登陆
- Linux C 文件的输入/输出操作
- 转载 修改 Linux 内核 DM9000 支持 tiny210 开发板
- 分析Linux下如何运行一个可执行文件?
- Linux内核中ioremap映射的透彻理解
- linux:每天学习一个命令——清屏
- Linux查看程序端口占用情况
- Linux用户管理(4)
- 串口调试小节之三 Linux串口应用层编程注意
- centos7 配置虚拟交换机(物理交换机truck端口设置)(使用brctl)
- 阿里云CENTOS服务器挂载数据盘
- linux下mysql的源码安装
- LINUX下导入、导出MYSQL数据库命令
- linux下mysql的源码安装
- Linux环境下安装codeblock
- 如何在CentOS/RHEL中安装基于Web的监控系统 linux-dash
- linux的定时计划任务Crontab