打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
实现线程读写锁的四种方法


读写锁:当已经被加了读锁时,其他的读模式锁请求仍然可以访问,但是写模式锁不能访问;当写模式锁加锁时,其他的请求都不能访问。

本文尝试用四种方法来完成读写锁的操作,都包含有写模式和读模式各自所要做的事情。

1、直接使用POSIX提供的读写锁

2、用条件变量实现读写锁

3、用互斥量实现读写锁

4、用信号量实现读写锁

直接使用读写锁

pthread中直接为我们提供的。

#include <pthread.h>      //多线程、读写锁所需头文件

pthread_rwlock_t  rwlock = PTHREAD_RWLOCK_INITIALIZER; //定义和初始化读写锁

写模式:

pthread_rwlock_wrlock(&rwlock);     //加写锁

写写写……

pthread_rwlock_unlock(&rwlock);     //解锁  

读模式:

pthread_rwlock_rdlock(&rwlock);      //加读锁

读读读……

pthread_rwlock_unlock(&rwlock);     //解锁 

用条件变量实现读写锁

这里用条件变量+互斥锁来实现。注意:条件变量必须和互斥锁一起使用,等待、释放的时候都需要加锁。

#include <pthread.h> //多线程、互斥锁所需头文件

pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;      //定义和初始化互斥锁

pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;       //定义和初始化条件变量

写模式:

pthread_mutex_lock(&mutex);     //加锁

while(w != 0 || r > 0)

{

     pthread_cond_wait(&cond, &mutex);      //等待条件变量的成立

}

w = 1;

pthread_mutex_unlock(&mutex);

写写写……

pthread_mutex_lock(&mutex);

w = 0;

pthread_cond_broadcast(&cond);       //唤醒其他因条件变量而产生的阻塞

pthread_mutex_unlock(&mutex);    //解锁

读模式:

pthread_mutex_lock(&mutex);     

while(w != 0)

{

     pthread_cond_wait(&cond, &mutex);      //等待条件变量的成立

}

r++;

pthread_mutex_unlock(&mutex);

读读读……

pthread_mutex_lock(&mutex);

r- -;

if(r == 0)

     pthread_cond_broadcast(&cond);       //唤醒其他因条件变量而产生的阻塞

pthread_mutex_unlock(&mutex);    //解锁

用互斥锁实现读写锁

这里使用2个互斥锁+1个整型变量来实现。

#include <pthread.h> //多线程、互斥锁所需头文件

pthread_mutex_t r_mutex = PTHREAD_MUTEX_INITIALIZER;      //定义和初始化互斥锁

pthread_mutex_t w_mutex = PTHREAD_MUTEX_INITIALIZER; 

int readers = 0;     //记录读者的个数

写模式:

pthread_mutex_lock(&w_mutex);

写写写……

pthread_mutex_unlock(&w_mutex);

读模式:

pthread_mutex_lock(&r_mutex);         

if(readers == 0)

     pthread_mutex_lock(&w_mutex);

readers++;

pthread_mutex_unlock(&r_mutex); 

读读读……

pthread_mutex_lock(&r_mutex);

readers- -;

if(reader == 0)

     pthread_mutex_unlock(&w_mutex);

pthread_mutex_unlock(&r_mutex); 

用信号量来实现读写锁

这里使用2个信号量+1个整型变量来实现。令信号量的初始数值为1,那么信号量的作用就和互斥量等价了。

#include <semaphore.h>     //线程信号量所需头文件

sem_t r_sem;     //定义信号量

sem_init(&r_sem, 0, 1);     //初始化信号量 

sem_t w_sem;     //定义信号量

sem_init(&w_sem, 0, 1);     //初始化信号量  

int readers = 0;

写模式:

sem_wait(&w_sem);

写写写……

sem_post(&w_sem);

读模式:

sem_wait(&r_sem);

if(readers == 0)

     sem_wait(&w_sem);

readers++;

sem_post(&r_sem);

读读读……

sem_wait(&r_sem);

readers- -;

if(readers == 0)

     sem_post(&w_sem);

sem_post(&r_sem);

--------------------- 

作者:ojshilu 

来源:CSDN 

原文:https://blog.csdn.net/ojshilu/article/details/25244389 

版权声明:本文为博主原创文章,转载请附上博文链接!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
linux c 线程间同步(通信)的几种方法
LINUX 多线程互斥量和读写锁区别
Linux C 实现多线程同步的四种方式(超级详细)
详解linux多线程——互斥锁、条件变量、读写锁、自旋锁、信号量
Linux之线程同步
线程同步、条件变量、互斥锁的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服