Linux——读写锁
Linux下,为了线程安全,为我们提供了很多种锁。
读写锁: 我们在编写多线程的时候,我们可能需要经常去读取某个共享数据变量,但是相对要改写这个变量的机会相对较少。在读的过程中,往往伴随着查找的操作,中间耗时很长,给这种代码加锁,会极大的降低我们程序的效率。所以提出了读写锁。
注意:写独占,读共享,写锁优先级高
例子:4个读线程,4个写线程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>pthread_rwlock_t rwlock; //定义读写锁
int counter;void *rrout(void *arg) //读线程函数
{int t;int i = *(int *)arg;free(arg);while(1){pthread_rwlock_rdlock(&rwlock);printf("read:%d : %#X : counter= %d\n",i,pthread_self(),counter);pthread_rwlock_unlock(&rwlock);usleep(1111);}
}void *wrout(void *arg) //写线程函数
{int t;int i = *(int *)arg;free(arg);while(1){t = counter;usleep(1000);pthread_rwlock_rdlock(&rwlock);printf("write:%d : %#X : counter= %d, ++counter = %d\n",i,pthread_self(),counter,++counter);pthread_rwlock_unlock(&rwlock);usleep(11111);}
}int main()
{int i = 0 ;pthread_t tid[8];pthread_rwlock_init(&rwlock,NULL); //读写锁初始化for(i = 0; i < 4; i ++){int *p = (int *)malloc(sizeof(int));*p = i;pthread_create(&tid[i],NULL,rrout,(void *)p);}for(i = 0; i < 4; i ++){int *p = (int *)malloc(sizeof(int));*p = i;pthread_create(&tid[i + 4],NULL,wrout,(void *)p);}for(i = 0; i < 8; i++){pthread_join(tid[i],NULL);}pthread_rwlock_destroy(&rwlock); //销毁读写锁
运行结果:
Linux——读写锁相关推荐
- 深度解析Linux读写锁逻辑
一.Linux为何会引入读写锁? 除了mutex,在linux内核中,还有一个经常用到的睡眠锁就是rw semaphore(后文简称为rwsem),它到底和mutex有什么不同呢?为何会有rw sem ...
- linux读写锁 饥饿,读写锁中写锁的饥饿问题
读写锁是个看上去很美的的抽象 代码是程序员对这个世界的抽象过程,是的,好的代码就像语言,将各个组件之间的关系描述的一清二楚,而读写锁在其中就是一个很好的例子,正如开头的一句引用,这是个看上去很美的抽象 ...
- Linux读写锁释放,Linux读写锁的使用
读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排它的,读可以有多个在读,写只有唯一个在写,写的时候不允许读. 具有强读者同步和强写者同步两种形式: 强读者同步:当写者没有进行写操作时,读者就 ...
- Linux多线程的同步------读写锁
前面介绍过Linux多线程同步的另外两个方法------互斥锁和信号量 Linux多线程的同步-----信号量和互斥锁_神厨小福贵!的博客-CSDN博客 下面来看一下读写锁: 读写锁和互斥锁都带有一个 ...
- c程序封装linux,Linux系统使用C语言封装线程读写锁
在Linux平台上已经有现成的线程读写锁pthread_rwlock_t以及相关API,现将这些API封装成与Win32平台上相同的接口,以便于编写跨平台程序.这些API包括pthread_rwloc ...
- Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)
同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...
- linux线程间同步(1)读写锁
读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁. 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞: 2 ...
- linux 进程 读写锁,linux 下实现高性能读写锁(read/write lock)
前一篇文章分析了Windows slim read/write lock的工作原理.我们知道它的设计相当精妙,于是我们可以借鉴它的思路来设计linux下的读写锁. 在这个读写锁的设计上,需要注意的是l ...
- linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障
内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...
最新文章
- 佳能80d有人脸识别吗_国家地理2020年旅行者最推荐相机Top10,有你喜欢的吗?
- Latex使用技巧01:改变数学公式字体的颜色
- 2018.12.5 区块链论文翻译
- 从“小”培养AI安全意识:OpenAI开源最新强化学习训练工具,安全约束自由定制,开箱即用...
- 个人或者企业怎么进行app开发?开发一款APP应用大概须要多少钱?
- 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战
- 浏览器无法运行java_window_浏览器无法运行JAVA脚本的解决方法,1、浏览器无法运行JAVA脚本的 - phpStudy...
- 怎么清空topic数据_20.Roscpp/Rospy:Topic_demo
- oracle定时删库,随手胡乱写的批处理,实现Oracle每天定时备库,DMP文件保留3天,3天后删除,对应2000系统...
- html5 “拖放”
- 小米高管:已投大量精力研发手机AI芯片,造不造还没定
- Windows平台下MySQL常用操作与命令
- 签到新旧版本更替问题
- linux jdk11 64位下载安装
- 毕设题目:Matlab肌电信号
- 机械制图之平面图形的尺寸分析
- python代码使用dns进行调试_python脚本实现分析dns日志并对受访域名排行
- nc63文件服务器,nc命令传输文件
- info setup 制作的安装程序 提示卸载程序出现内部错误找不到此版本的卸载程序的utCompiledCode记录
- 我的世界服务器信号下面是红,适用于服务器的红石抽奖机我的世界抽奖机电路图...