基于互斥锁和条件变量实现读写锁,写优先
来源:互联网 发布:mac魅可三里屯店铺电话 编辑:程序博客网 时间:2024/06/05 23:51
#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <stdlib.h>class MyRWLock{public:MyRWLock():_stat(0),_have_wlock_wait(false){pthread_mutex_init(&_mutex,NULL);pthread_cond_init(&_cond,NULL);}~MyRWLock() {pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond);}void ReadLock() {pthread_mutex_lock(&_mutex);while (_stat < 0 || _have_wlock_wait) {pthread_cond_wait(&_cond,&_mutex);}++_stat;pthread_mutex_unlock(&_mutex);}void ReadUnlock() {pthread_mutex_lock(&_mutex);if (--_stat == 0) {pthread_cond_signal(&_cond);}pthread_mutex_unlock(&_mutex);}void WriteLock() {pthread_mutex_lock(&_mutex);while (_stat != 0) {_have_wlock_wait = true;pthread_cond_wait(&_cond,&_mutex);}_stat = -1;_have_wlock_wait= false;pthread_mutex_unlock(&_mutex);}void WriteUnlock() {pthread_mutex_lock(&_mutex);_stat = 0;pthread_cond_broadcast(&_cond);pthread_mutex_unlock(&_mutex);}private:pthread_mutex_t _mutex;pthread_cond_t _cond;int _stat; // == 0 not lock ,> 0 read lock count,< 0 have write lockbool _have_wlock_wait;};class MyRLockWrapper {public:MyRLockWrapper(MyRWLock &lock):_lock(lock) {_lock.ReadLock();}virtual ~MyRLockWrapper() {_lock.ReadUnlock();}private:MyRLockWrapper();MyRLockWrapper(const MyRLockWrapper& orig);MyRLockWrapper& operator=(const MyRLockWrapper &orig);MyRWLock &_lock;};class MyWLockWrapper {public:MyWLockWrapper(MyRWLock &lock):_lock(lock) {_lock.WriteLock();}virtual ~MyWLockWrapper() {_lock.WriteUnlock();}private:MyWLockWrapper();MyWLockWrapper(const MyWLockWrapper& orig);MyWLockWrapper& operator=(const MyWLockWrapper &orig);MyRWLock &_lock;};MyRWLock g_lock;void * rfunc(void*args) {while(1) {{MyRLockWrapper lock(g_lock);printf("at rfunc,[%lu]\n",pthread_self());sleep(1);}}}void * wfunc(void*args) {while(1) {{MyWLockWrapper lock(g_lock);printf("at wfunc,[%lu]\n",pthread_self());sleep(1);}}}int main(void) {pthread_t rtid[1],wtid[1];for(int i =0;i<1;i++){pthread_create(&rtid[i],NULL,rfunc,NULL);}for(int i =0;i<1;i++){pthread_create(&wtid[i],NULL,wfunc,NULL);}pause();return 0;}
备注:本篇并非完全意义上的原创,是参考了如下文章的思路,进行了实现,并增加了写优先的策略,在此谨向作者致敬
http://blog.csdn.net/raomeng1/article/details/7685421
- 基于互斥锁和条件变量实现读写锁,写优先
- 互斥锁和条件变量实现读写锁
- 使用Boost的共享锁、条件变量、原子操作实现写优先的读写锁
- 使用互斥锁和条件变量实现实现读写锁
- 利用条件变量和互斥锁实现读写锁
- 借助互斥量和条件变量实现读写锁
- 使用boost条件变量实现写优先的读…
- 互斥锁 条件变量 读写锁
- 读写锁 要写线程优先那么还可以使用条件变量的方法,具体做法可以参考msdn。
- 一个写优先的读写锁实现
- 无锁编程:c++11基于atomic实现共享读写锁(写优先)
- 信号量、互斥锁,读写锁和条件变量的区别
- 信号量、互斥锁,读写锁和条件变量的区别
- 线程同步之互斥锁、读写锁和条件变量
- 尝试用c11的条件变量和mutex写了一个读写锁
- 实现锁和条件变量
- 互斥锁 自旋锁 读写锁 条件变量
- 利用信号实现写优先的读写锁
- IOS数据库操作SQLite3使用详解
- ubuntu/xubuntu + xp 双系统
- /C++中如何获取数组的长度?
- 对学习编程者的忠告:
- 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
- 基于互斥锁和条件变量实现读写锁,写优先
- HTTP 协议详解
- hdu 1671 Phone List(字典树)
- oracle常用经典SQL查询
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- 关于Unity3D中Resources动态加载NGUI图片的方法!!!
- log4j配置祥解
- android 通话记录和联系人查询
- 海量数据处理专题(六)——双层桶划分